首页 > 解决方案 > 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

标签: c++multithreadingclangmutexstatic-analysis

解决方案


我的理解是,您可能会MutexLocker

auto locker = MutexLocker(&m);

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


推荐阅读