【问题标题】:C++ / boost::scoped_lock : compiler warnings missingC++ / boost::scoped_lock:缺少编译器警告
【发布时间】:2015-07-23 15:37:42
【问题描述】:

我想知道是否可以配置 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);
    }
};

【问题讨论】:

    标签: c++ boost boost-mutex


    【解决方案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。

    【讨论】:

      【解决方案2】:

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

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

      见:C++ Warning if re-declaring member variable in function

      对于clang:-Wshadow-ivar

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多