c++ - Clang++ SCOPED_CAPABILITY 产生“警告:释放未持有的互斥锁”
问题描述
在尝试对现有代码库实施必要的注释后,我无法删除看似简单的警告。我回到最简单的例子,仍然没有喜悦。
我已经mutex.h
完全按照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)这是一个误报,在解决clang实现问题之前必须忽略它。对此类问题的搜索尚未给出有用的结果。
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()
再次调用(从而导致双重释放错误)。
推荐阅读
- javascript - 在 Firebase 函数中构建 API 端点以接收值并计算它们
- javascript - 我可以做一个
- git - 从另一个仓库更新 Bitbucket 仓库中的文件
- python - 其他用户的个人资料没有显示,它只显示当前用户名。如何显示其他用户的个人资料?
- c++ - 如何在插入 BST 之前访问对象
- python - 如何在 PythonAnywhere 的环境变量中定位 Django 设置模块?
- linux - Shell if[[]] 在执行时给出语法错误
- javascript - 如何在 3d 平面中向上移动图像
- google-bigquery - BigQuery concat 嵌套数组 json
- python - python - 当我希望对象具有 None 值时出现“NoneType”对象错误?