Nano Hash - криптовалюты, майнинг, программирование

C++/boost::scoped_lock: предупреждения компилятора отсутствуют

Мне интересно, можно ли настроить компилятор С++ так, чтобы он выдавал предупреждение, когда кто-то устанавливает scoped_lock, но забывает присвоить его переменной.

См. примеры ниже:

  • Случай 1.1 и случай 2.1 показывают предполагаемое использование scoped_lock.
  • Случай 1.2 является ошибочным использованием, когда переменная держателя не создается. Это правильно определяется компилятором как ошибка (mMutex имеет предыдущее объявление)
  • Случай 2.2 — это почти та же ошибка, что и случай 1.2, но компилятор не обнаруживает и не выдает никаких предупреждений, хотя код явно неисправен, и очень близок к случаю 1.2 (и, конечно, блокировка мьютекса не сработает).

См. код ниже, я тестировал его с g++-4.8 и Visual Studio 2010. Ни один из них не обнаруживает ошибочный случай 2.2.

Кто-нибудь знает, почему компилируется случай 2.2 и что можно сделать, чтобы компилятор обнаружил его как предупреждение?

#include  <boost/thread/recursive_mutex.hpp>
void Mutex1()
{
  boost::recursive_mutex mMutex;

  //Case 1.1 : correct mutex creation
  boost::recursive_mutex::scoped_lock lock(mMutex);

  //Case 1.2 : incorrect mutex creation
  //==> leads to a compile error : "mMutex has a previous declaration" : perfect
  boost::recursive_mutex::scoped_lock(mMutex);    
}

class FooMutex
{
    boost::recursive_mutex mMutex;
    void TestMutex()
    {
        //Case 2.1 : correct mutex creation
        boost::recursive_mutex::scoped_lock lock(mMutex);//compiles correctly => ok

        //Case 2.2 : incorrect mutex creation
        //is compiled without warning ! Ouch !!!
        boost::recursive_mutex::scoped_lock(mMutex);
    }
};
23.07.2015

Ответы:


1

Эта строка:

boost::recursive_mutex::scoped_lock(mMutex);

эквивалентен этой строке:

boost::recursive_mutex::scoped_lock mMutex;

таким образом, каким будет предупреждение или ошибка компилятора? В первом случае это ошибка, потому что вы пытаетесь повторно объявить mMutex, но во втором случае это вполне разумный код, поскольку scoped_lock конструируется по умолчанию. Это неправильно только для конкретной логики в вашей функции. Компилятор не может читать ваши мысли.

Если вы хотите просто предотвратить создание scoped_lock по умолчанию, вы можете просто создать свой собственный, которого нет:

template <typename T>
struct my_unique_lock : boost::unique_lock<T> {
     using boost::unique_lock<T>::unique_lock;

     my_unique_lock() = delete;
};

struct my_recursive_mutex : boost::recursive_mutex {
    using scoped_lock = my_unique_lock<my_recursive_mutex>;
};

Туда,

my_recursive_mutex mMutex;
{
    my_recursive_mutex::scoped_lock(mMutex);
}

не будет компилироваться, так как конструктор по умолчанию — deleted.

23.07.2015

2

На самом деле g++ может выдать предупреждение об этом: -Wshadow

g++ -Wall -Wshadow test.cpp -lboost_thread-mt -l boost_system

См.: Предупреждение С++ при повторном объявлении переменной-члена в функции

И для clang: -Wshadow-ivar

23.07.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..