Clang++ SCOPED_CAPABILITY 产生 "warning: releasing mutex 'locker' that was not held"

Clang++ SCOPED_CAPABILITY produces "warning: releasing mutex 'locker' that was not held"

在尝试对现有代码库实施必要的注释后,我无法删除看似简单的警告。回到最简单的例子,还是不开心

我 cut-and-pasted mutex.h header 与 Thread Safety Analysis 中指定的完全一样。我似乎无法在不发出警告的情况下进行范围锁定。这是代码:

#include "mutex.h"

#include <iostream>

// functions added just to complete the implementation
void Mutex::Lock()
{
}
void Mutex::GenericUnlock()
{
}

// test a scoped lock
void do_something(Mutex &m)
{
    auto locker = MutexLocker(&m);
    std::cout << "Hello, world!\n";
}

int main(int argc, char** argv)
{
    Mutex my_mutex;
    do_something(my_mutex);
}

使用 clang++ -o thread_static_analysis thread_static_analysis.cpp -std=c++17 -Wthread-safety 编译会产生以下警告:

thread_static_analysis.cpp:18:1: warning: releasing mutex 'locker' that was not held [-Wthread-safety-analysis]
}
^
1 warning generated.

要么 (1) 我遗漏了一些东西,要么 (2) 这是一个必须忽略的 false-positive,直到 clang 实现问题得到解决。搜索此类问题 as-yet 没有得到有用的结果。

clang version 10.0.0-4ubuntu1 
Target: x86_64-pc-linux-gnu
Thread model: posix

我的理解是,您可能会在

中创建临时 MutexLocker 对象的副本
auto locker = MutexLocker(&m);

(或线程安全分析认为您正在创建它)。然后临时对象被销毁并调用 m.Unlock()。然后在函数结束时 locker 对象被销毁并再次调用 m.Unlock() (因此导致双重释放错误)。