调用WTSEnumerateSessionsEx触发C6387告警的原因与解决方法咨询
警告触发原因
C6387是Visual Studio内置静态代码分析工具基于SAL(源代码注解语言)规则抛出的警告,含义为「传入的参数可能不符合接口的输入规范,存在无效值风险」。
你遇到的该警告属于已知的SDK注解偏差问题:
- 旧版本Windows SDK头文件中,
WTSEnumerateSessionsEx接口的ppSessionInfo参数(你代码中传入&info的第四个参数)的SAL注解被错误标注为_Inout_类型,而非正确的_Out_类型。 - 静态分析器按照错误的
_Inout_规则校验时,要求参数指向的info变量在传入时为非NULL有效值,但你将info初始化为了NULL,因此触发警告。
代码运行正常的原因是注解本身错误:ppSessionInfo是纯输出参数,函数内部会直接分配内存并将地址写入*ppSessionInfo,完全不会读取你传入的初始NULL值,因此逻辑上没有问题。
修复方案
- 方案1(最推荐,无副作用):在调用语句前增加单行警告抑制指令,仅关闭当前行的C6387警告,不影响其他代码的静态分析校验,修改后代码如下:
WTS_SESSION_INFO_1* info = NULL; DWORD info_count = 0; DWORD level = 1; // 抑制因SDK注解错误触发的C6387警告 #pragma warning(suppress: 6387) WTSEnumerateSessionsEx(WTS_CURRENT_SERVER_HANDLE, &level, 0, &info, &info_count); // 业务逻辑处理... // 记得用完后释放WTS分配的内存 if (info != NULL) { WTSFreeMemory(info); }
- 方案2:升级到最新版Windows SDK,微软已在后续版本中修正了该参数的SAL注解错误,升级后该警告会自动消失。
- 不推荐的方案:将
info初始化为非NULL的临时值,这种方式会引入不必要的代码,还有内存泄漏风险。
内容的提问来源于stack exchange,提问作者Oleg Korzhukov
相关产品推荐
相关产品推荐

