我正在使用 Visual Studio 2015,并且我还安装(并重新安装)了最新的 sdk。我开始了一个新项目并设置了警告级别,我还设置了“将警告视为错误”,并且我已经设置为在构建时运行静态代码分析。包含以下代码的简单 main.c 将输出一些有趣的 SAL 注释警告。
代码:
// main.c
#include <Windows.h>
#include <stdio.h>
int main()
{
printf("wtf?");
return 0;
}
错误输出:
c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\string.h(130): warning C28252: Inconsistent annotation for 'strcpy': _Param_(1) has 'SAL_writableTo(elementCount(_String_length_(__formal(1,parameter1))+1))' on the prior instance. See <no file>(0).
c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\string.h(130): warning C28253: Inconsistent annotation for 'strcpy': _Param_(1) has 'SAL_writableTo(elementCount(_String_length_(_Source)+1))' on this instance. See <no file>(0).
补充说明:
- 发现这只发生在发布版本上(在调试上它工作得很好)
- 仅当源为 .c 时才会发生(在使用 .cpp 的发布/调试中都可以正常工作)
到目前为止尝试的解决方案:
- 重新安装visual studio 2015 + sdk
- 尝试在 de string.h 标头中 #pragma warning(suppress:28253) 但它不允许我修改该标头
在几个错误提交/票证上,我发现一些微软老兄说它已在最新的 sdk 中修复,并且还发布了指向下载页面 vor vs2015 社区的链接(我再次重新下载并重新安装)但它似乎仍然没有工作(至少对我来说
我现在可能会在没有“将警告视为错误”的情况下继续该项目,但如果有人能给我一个没有小技巧/解决方法的优雅解决方案,我将不胜感激。
提前谢谢你,干杯!
更新 1 临时解决方案:
#define SAFE_INCLUDE_GUARD_BEGIN __pragma(warning(push)) \
__pragma(warning(disable:28253)) \
__pragma(warning(disable:28252))
#define SAFE_INCLUDE_GUARD_END __pragma(warning(pop))
SAFE_INCLUDE_GUARD_BEGIN
// broken microsoft header includes go here ( like Windows.h, etc )
SAFE_INCLUDE_GUARD_END