You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的锁定关系。可以尝试:
    1. 确保gMutex是通过标准API(如CreateMutex)初始化的有效句柄;
    2. 在WaitForSingleObject调用处显式添加SAL注释_Acquires_lock_(gMutex)辅助工具识别。
  • 版本兼容性问题:部分SAL并发规则在Visual Studio 2022的17.2.x早期版本中可能存在触发异常。建议将Visual Studio更新到最新稳定版本后再测试。

内容的提问来源于stack exchange,提问作者minguu42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:54:24