gsl :: suppress整个include语句

时间:2017-06-03 15:59:15

标签: c++ cpp-core-guidelines

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

Microsoft.CppCoreCheck
Microsoft.Gsl

当我运行它时,我从包含的库中获得了一堆错误,如标准库,glm,boost等。

一个具体的例子是SDL.h我在sdl_stdinc.h收到警告。 我确保只通过我控制下的一个标题包含SDL:

ExtSDL.hpp

#pragma once
#pragma warning(disable: 4710)
#pragma warning(push, 0)
#include <SDL.h>
#pragma warning(pop)

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

2 个答案:

答案 0 :(得分:2)

到目前为止,我发现的最实用的方法是建立#defines之类的

#define SDL_WARNINGS 4710 26135

然后#include其他人的脏代码

#pragma warning(push)
#pragma warning(disable: SDL_WARNINGS)
#include <SDL.h>
#pragma warning(pop)

根据相关的警告代码,例如上面的C26135,这将使gsl检查器的警告静音。它使编译器完全沉默在你希望它保持安静的位置。请注意,警告禁用是 local 到推/弹范围。

这种方法允许编译/ Wall / WX,即使你打开额外的检查,包括gsl。重要的是,即使您依赖于其他人的标题并且没有警告干净,它也会起作用。遗憾的是,这包括我已经看到的每个C和C ++标准库实现加上Boost,LLVM,Windows SDK等等,即基本上所有内容。此外,它可以保护您免受恶意标题的影响,这些标题会改变警告编译指示(一些标准库实现用于执行此操作并且可能仍然......)此方法允许您将自己的代码提升到比您依赖的渣滓更高的清洁度和质量水平在

Microsoft C ++核心检查的一个好处是它们将它与用于警告的常用机制联系起来的方式,因此这种方法适用于额外规则集中的常规警告和检查程序。谢天谢地,他们做了类似这样的事情:一些gsl检查器相当可疑,并且与许多现存的编码风格不兼容,即转换gsl on代码#includes大标准供应商库,你很快就需要构建一长串警告代码来禁用在您将噪音降低之前,您可以专注于自己的代码。当然,您可以全局#pragma warning(disable: GSL_CHECKERS_YOU_DONT_LIKE)获取自己的代码,这样您就可以专注于您认为有用的方面。

或者,您可以通过选择要使用的规则集和/或制作自定义规则来选择要应用的规则。这可能会最大程度地缩短您的构建时间,而这在构建分析时并不快。

对你的问题有一个更直接的答案会很好,因为你可以快速建立脏标题,因为你可以禁用其他人的东西和#34;。这是一个明显的功能请求,但我不知道它受到支持。据推测,实施例如,这将是非常简单的。只对在指定的一组目录中找到的源代码运行检查器,因此如果#include在该区域之外的步骤,则会自动禁用检查器。微软有人在读这篇文章吗?

答案 1 :(得分:2)

有多种方法可以禁止CppCoreCheck警告:

  • 您可以使用以下任何一种抑制CppCoreChecks [[gsl :: suppress( chapter )]]属性,其中 chapter 来自C++ Core Guidelines,例如con.4。另请参阅MS docs以获取信息。
  • 如上所述,您可以使用#pragma warning单独或批量取消警告。
  • 您可以使用CAExcludePath禁止显示有关“不是您的代码”的所有警告。