在shared_ptr中使用Clang线程安全分析

时间:2018-12-05 01:16:27

标签: c++ thread-safety clang shared-ptr

我正在使用Clang 7.0的Clang Thread Safety Analysis 功能

但是,当我尝试将PT_GUARDED_BY注释与shared_ptr数据成员一起使用时出现错误:

  错误:“ pt_guarded_by”仅适用于指针类型;这里的类型是'shared_ptr '[-Werror,-Wthread-safety-attributes]

这对我来说有点困惑,因为文档说“ PT_GUARDED_BY是...旨在用于指针和智能指针。”,甚至给出了一个使用std :: unique_ptr的示例(使用与我基本相同的语法正在使用)。

std :: shared_ptr与Clang的线程安全分析不兼容,还是这里发生了其他事情?我应该如何指出在未锁定相关互斥锁的情况下不应访问指向的类?

(这在Linux上使用GCC的libstdc ++标准库,如果需要的话。)


经过一些实验,看起来只有在shared_ptr是成员变量而不是全局变量时才会发生。

#include "mutex.h" // The suggested mutex.h file from the Clang Thread Safety Analysis page
#include <memory>

Mutex mu;

std::shared_ptr< int > toplevel PT_GUARDED_BY(mu); // Okay

class Wrapper {
public:
  std::shared_ptr< int > member PT_GUARDED_BY(mu); // Results in error
};

void test() {
  Wrapper wrapped;
  wrapped.member = std::shared_ptr< int >( new int ); // Should be OK
  *wrapped.member = 42; // Should raise warning
}

我会注意到,如果我将unique_ptr换成shared_ptr,则全局变量和成员变量都可以正常工作。

1 个答案:

答案 0 :(得分:0)

在玩过各种Clang编译和不同的C ++标准库后,我想我已经明白了。

与(GCC)libstdc ++结合使用时,这是Clang 7.0.0中的一个错误。

如果您使用当前(2018年12月4日)干线Clang(因此最终将变成8.0.0)(GCC的libstdc ++和(Clang的)libc ++都可以按预期工作。

如果您使用Clang 7.0.0,则与(Clang干线的)libc ++一样,事情将按预期工作,但如果与(GCC的)libstdc ++一起使用,则会产生上述错误……至少对于GCC 4.8-GCC 6.2中的libstdc ++而言范围(这是我手头要测试的范围。)