C++ gsl::抑制整个包含语句

C++ gsl::抑制整个包含语句,c++,cpp-core-guidelines,C++,Cpp Core Guidelines,我正在将指南支持库检查器集成到我的一个项目中 Microsoft.CppCoreCheck Microsoft.Gsl 当我运行它时,我从包含的库(如标准库、glm、boost等)中得到一系列错误 一个具体的例子是SDL.h,我在SDL\u stdinc.h中得到警告。 我确保仅通过我控制的一个标题包含SDL: ExtSDL.hpp #pragma once #pragma warning(disable: 4710) #pragma warning(push, 0) #include <

我正在将指南支持库检查器集成到我的一个项目中

Microsoft.CppCoreCheck
Microsoft.Gsl
当我运行它时,我从包含的库(如标准库、glm、boost等)中得到一系列错误

一个具体的例子是
SDL.h
,我在
SDL\u stdinc.h
中得到警告。 我确保仅通过我控制的一个标题包含SDL:

ExtSDL.hpp

#pragma once
#pragma warning(disable: 4710)
#pragma warning(push, 0)
#include <SDL.h>
#pragma warning(pop)
#pragma一次
#杂注警告(禁用:4710)
#pragma警告(推送,0)
#包括
#布拉格警告(pop)

我找不到有关如何将此库从静态代码分析中排除的信息。

到目前为止,我发现的最实用的方法是建立
#定义

#define SDL_WARNINGS 4710 26135
然后
#把别人的脏代码也包括进去

#pragma warning(push)
#pragma warning(disable: SDL_WARNINGS)
#include <SDL.h>
#pragma warning(pop)
#pragma警告(推送)
#杂注警告(禁用:SDL_警告)
#包括
#布拉格警告(pop)
这将根据gsl Checker的相关警告代码(如上面的C26135)使gsl Checker的警告静音。它使编译器在您希望它保持安静的地方完全静音。注意:警告禁用是推/弹出范围的局部禁用

这种方法允许编译/Wall/WX,即使启用了额外的检查,包括gsl。关键的是,即使您依赖于其他人的标题,而这些标题不干净,它也能正常工作。遗憾的是,这包括我见过的每个C和C++标准库的实现,加Boost、LLVM、Windows SDK等,也就是基本上所有的东西。此外,它还可以保护您不受有害的头文件的影响,这些头文件会改变警告pragmas(一些标准的库实现用于执行此操作,并且可能仍然…),这种方法允许您将自己的代码提升到比您所依赖的糟粕更高的清洁度和质量级别

<>微软的C++核心检查的一个优点是它们把它绑定到警告中常用的机制,所以这种方法在额外的规则集中对常规警告和检查程序是一致的。谢天谢地,他们这样做了:一些gsl检查程序相当可疑,并且与许多现存的编码风格不兼容,例如,为包含大型标准供应商库的代码打开gsl,您需要快速构建一长串要禁用的警告代码,然后才能调低噪音,以便专注于自己的代码代码。当然,您可以为自己的代码全局设置
#pragma warning(禁用:GSL\u CHECKERS\u您不喜欢)
,因此您可以专注于您认为有用的方面

或者,您可以通过选择要使用的规则集和/或创建自定义规则集来选择要应用的规则。这可能会使您的构建时间最小化,因为启用代码分析后,构建时间不会那么快


如果能对你的问题有一个更直接的答案就好了,因为你可以禁用“其他人的东西”的checker,这样就可以快速生成脏标题。这是一个明显的功能要求,但我不知道它是否得到支持。假设只在指定目录集中的源代码上运行检查程序,那么实现检查程序将非常简单,因此,如果在该区域之外包含步骤,检查程序将自动禁用。Microsoft是否有人阅读此信息?

有多种方法可以抑制CppCoreCheck警告:

  • 您可以使用以下两种方法抑制CppCoreChecks: [[gsl::suppress(chapter)]]属性,例如,其中chapter来自。请同时查看以获取信息
  • 您可以使用单独或批量抑制警告,如上面的mentioend
  • 您可以使用取消显示“非您的代码”的所有警告

“CAExcludePath”在这里可能是正确的。我可以很容易地为我的外部文件定义文件夹。直到现在我才开始测试它。我测试了一下,效果很好\“packages”是我的目录,因为我在VS2017环境中使用nuget。现在,days GSL还具有GSL_SUPPRESS(x),其功能与[[GSL::SUPPRESS(x)]相同。