1

我正在使用 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
4

0 回答 0