SAL未触发C26105等并发检测警告问题咨询
问题描述
我尝试使用Microsoft源代码注释语言(SAL)检测并发Bug,已按照《Sample C++ project for code analysis》配置项目,并测试《Code analysis for C/C++ warnings》中的示例代码。但部分预期出现的警告未触发:C26100等警告正常出现,而C26105、C26116等未出现。针对C26105,我使用官方示例代码测试(代码如下)仍无警告:
#include <sal.h> #include <Windows.h> _Create_lock_level_(MutexLockLevel); _Create_lock_level_(TunnelLockLevel); _Create_lock_level_(ChannelLockLevel); _Lock_level_order_(MutexLockLevel, TunnelLockLevel); _Lock_level_order_(TunnelLockLevel, ChannelLockLevel); _Has_lock_level_(MutexLockLevel) HANDLE gMutex; struct Tunnel { _Has_lock_level_(TunnelLockLevel) CRITICAL_SECTION cs; }; struct Channel { _Has_lock_level_(ChannelLockLevel) CRITICAL_SECTION cs; }; void OrderInversion(Channel* pChannel, Tunnel* pTunnel) { EnterCriticalSection(&pChannel->cs); // 预期触发Warning C26105,但未出现 WaitForSingleObject(gMutex, INFINITE); EnterCriticalSection(&pTunnel->cs); LeaveCriticalSection(&pTunnel->cs); LeaveCriticalSection(&pChannel->cs); }
环境信息:Windows 10 Pro 21H2 19044.1826、Visual Studio Community 2022 Version 17.2.6。请问未触发这些警告的原因是什么?
可能的原因及解决办法
- 并发类规则未启用:C26105、C26116属于并发相关代码分析规则,默认规则集可能未包含这类规则。需手动开启:
项目属性 → 代码分析 → 规则集 → 选择「Microsoft All Rules」,或手动展开「Concurrency Rules」勾选C26105、C26116等目标规则。 - 分析模式限制:Visual Studio的快速分析模式可能跳过复杂的并发规则检查。需切换到完整分析模式:
项目属性 → 代码分析 → 常规 → 将「分析模式」设置为「完整」,并确保「运行代码分析」选项设置为「生成时」或手动触发完整分析。 - 锁操作识别问题:代码分析工具可能未正确关联
WaitForSingleObject与gMutex的锁定关系。可以尝试:- 确保
gMutex是通过标准API(如CreateMutex)初始化的有效句柄; - 在
WaitForSingleObject调用处显式添加SAL注释_Acquires_lock_(gMutex)辅助工具识别。
- 确保
- 版本兼容性问题:部分SAL并发规则在Visual Studio 2022的17.2.x早期版本中可能存在触发异常。建议将Visual Studio更新到最新稳定版本后再测试。
内容的提问来源于stack exchange,提问作者minguu42
相关产品推荐
相关产品推荐

