繁体   English   中英

C ++ / boost :: scoped_lock:缺少编译器警告

[英]C++ / boost::scoped_lock : compiler warnings missing

我想知道是否可以配置c ++编译器,以便在有人实例化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);
    }
};

这一行:

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);
}

不会编译,因为默认构造函数是delete d。

实际上g ++可以为此提供警告:-Wshadow

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

请参阅: C ++警告是否在函数中重新声明成员变量

对于clang:-Wshadow-ivar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM