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()
(因此导致双重释放错误)。
在尝试对现有代码库实施必要的注释后,我无法删除看似简单的警告。回到最简单的例子,还是不开心
我 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()
(因此导致双重释放错误)。