Мне интересно, можно ли настроить компилятор С++ так, чтобы он выдавал предупреждение, когда кто-то устанавливает 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);
}
};