This post written by Sergiy Oryekhov and Andrew Pardoe
With several new rules added to the Core Guidelines Checker in Visual Studio 2017 15.3, the amount of warnings produced for pre-existing code may greatly increase. The C++ Core Guidelines include a lot of recommendations that cover all kinds of situations in C+ code. We know that not everyone can do large rewrites of legacy codebases. The techniques in this blog post will help you use the C++ Core Guidelines to start an incremental journey towards a cleaner codebase by selectively enabling warnings or enabling warnings on a selected code region.
In some cases, these techniques will help you deal with problems in the code analysis. All code analysis is heuristic in nature and can produce warnings where your code is actually correct—we call these “false positives”. The methods listed below will also help you to suppress individual cases of false positives that may be raised on your code.
Using rule sets to filter warnings
Visual Studio provides a few predefined rule sets to pick a more appropriate level of quality checks when Code Analysis runs on a project. In this release, we added rule sets that focus specifically on different groups of C++ Core Guidelines warnings. By selecting a specific group, you can slice results and work through them more efficiently.
To see information about new rule sets: open the Project Properties dialog, select “Code Analysis\General”, open the dropdown in the “Rule Sets” combo-box, pick “Choose multiple rule sets”:
We recommend starting with the rule set “C++ Core Check Rules”. This rule set includes and enables all other C++ Core Check categories.
The “Native Minimum” and “Native Recommended” rule sets include C++ Core Check rules in addition to other checks performance by the C++ Code Analysis tools.
Keep in mind, you must enable the C++ Core Guidelines Checker extension to see warnings from these rule sets. Once it is enabled, you can choose which warnings to show, and which to hide.
Using macros to filter warnings
The C++ Core Guidelines Checker comes with a header file that defines handy macros to ease warning suppressions in code:
ALL_CPPCORECHECK_WARNINGS CPPCORECHECK_TYPE_WARNINGS CPPCORECHECK_RAW_POINTER_WARNINGS CPPCORECHECK_CONST_WARNINGS CPPCORECHECK_OWNER_POINTER_WARNINGS CPPCORECHECK_UNIQUE_POINTER_WARNINGS CPPCORECHECK_BOUNDS_WARNINGS
These macros correspond to the rule sets and expand into space-separated lists of warning numbers.
How is this useful? By using the appropriate pragma constructs you can configure the effective set of rules that are interesting for your project (or maybe a portion of your code). For example, here we want to see only warnings about missing constant modifiers:
#include <CppCoreCheck/Warnings.h> #pragma warning(disable: ALL_CPPCORECHECK_WARNINGS) #pragma warning(default: CPPCORECHECK_CONST_WARNINGS)
Using attributes to filter warnings
The Microsoft Visual C++ compiler has limited support for the GSL suppress attribute. This attribute can be used to suppress warnings on expressions and block statements inside of a function. You can use either the specific warning number (e.g., 26400) or the rule ID from the C++ Core Guidelines (e.g., r.11). You can also suppress the entire rule group as shown below.
// Suppress only warnings from the 'r.11' rule in expression. [[gsl::suppress(r.11)]] new int; // Suppress all warnings from the 'r' rule group (resource management) in block. [[gsl::suppress(r)]] { new int; } // Suppress only one specific warning number. // For declarations, you may need to use the surrounding block. // Macros are not expanded inside of attributes. // Use plain numbers instead of macros from Warnings.h. [[gsl::suppress(26400)]] { int *p = new int; }
Using command line options to subset warnings
You can also use command line options to suppress warnings per file or per project. For example, you can pick one file from your project and disable the warning 26400 in its properties page:
You can even temporarily disable code analysis for a file by specifying “/analyze-“. This will produce warning D9025 “overriding ‘/analyze’ with ‘/analyze-‘”, which will remind you to re-enable code analysis later.
In closing
These C++ Core Guidelines Checker rulesets,
gsl::suppress attributes, and macros are new in Visual Studio 2017. Try them out and give us feedback on what you like and what you’d like to see improved.
If you have any feedback or suggestions for us about the C++ Core Guidelines Checker or any part of Visual C++, please).
Join the conversationAdd Comment
Is there a way to suppress warnings just for third party libraries?
I’m trying to use C++ Core Guideline Checker with Google Test, but there are a great number of warnings occurring in a great number of locations in the code from Google Test (such as TEST macro), and configuring suppression to each of such warning will cause maintenance hell without a smart solution.
There is a question in Stack Overflow () but no answer is provided yet.
(And this question receives relatively low attention, sadly.)
There’s an undocumented environment variable, CAExcludePath, that filters warnings from files in that path. I usually run with %CAExcludePath% set to %Include%.
You can also use it from MSBuild, see here for an example (with mixed success): Suppress warnings for external headers in VS2017 Code Analysis
We are working on something similar to GCC’s system headers that should be a more comprehensive solution to this problem.