CON50-CPP. 不要在互斥锁被锁定时销毁它
原文链接:
CON50-CPP. Do not destroy a mutex while it is locked
互斥锁对象被用于防止并发访问共享数据。如果一个互斥锁对象在线程等待锁被阻塞时被销毁,临界区和共享数据将不再受到保护。 C++标准 [thread.mutex.class],第5段 [ISO/IEC 14882-2014] 规定如下:
如果程序销毁了任何线程所拥有的互斥锁对象或一个线程在拥有互斥锁对象时终止,那么程序的行为是未定义的.
类似措辞也适用于 std::recursive_mutex
、std::timed_mutex
、std::recursive_timed_mutex
和std::shared_timed_mutex
。这些声明意味着在线程等待互斥锁的时销毁互斥锁对象是未定义的行为。
不合规代码示例
这个不合规的代码示例创建了几个线程,每个线程都调用 do_work()
函数,传递一个唯一的数字作为 ID。
不幸的是,这段代码包含了一个竞态条件,允许销毁仍被占有的互斥锁还,因为 start_threads()
可能在所有线程退出之前调用互斥锁的析构函数。
1 |
|
合规解决方案
这个合规的解决方案通过延长互斥对象的生命周期消除了竞态条件。
1 |
|
合规解决方案
这个合规的解决方案在互斥对象的析构函数被调用前, 通过 joining 线程消除了竞态条件。
1 |
|
Risk Assessment
Destroying a mutex while it is locked may result in invalid control flow and data corruption.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
CON50-CPP | Medium | Probable | High | P4 | L3 |
Automated Detection
Tool | Version | Checker | Description |
---|---|---|---|
CodeSonar | 7.3p0 | CONCURRENCY.LOCALARG | Local Variable Passed to Thread |
Helix QAC | 2023.1 | DF961, DF4962 | |
Klocwork | 2023.1 | CERT.CONC.MUTEX.DESTROY_WHILE_LOCKED | |
Parasoft C/C++test | 2022.2 | CERT_CPP-CON50-a | Do not destroy another thread’s mutex |
Polyspace Bug Finder | R2023a | CERT C++: CON50-CPP | Checks for destruction of locked mutex (rule partially covered) |
PRQA QA-C++ | 4.4 | 4961, 4962 |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
MITRE CWE | CWE-667, Improper Locking |
---|---|
SEI CERT C Coding Standard | CON31-C. Do not destroy a mutex while it is locked |
Bibliography
[ISO/IEC 14882-2014] | Subclause 30.4.1, “Mutex Requirements” |
---|---|
本文标题:CON50-CPP. 不要在互斥锁被锁定时销毁它
文章作者:xwnb
发布时间:2023-04-01
最后更新:2023-04-17
原始链接:https://xwnb.github.io/posts/3790056389/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
分享