Tre*_*key 5 c++ gcc g++ compiler-flags compiler-warnings
像许多人一样,我使用大量警告标志构建我的项目。
由于并非所有警告标志都是有害的,因此编译会变得嘈杂。
诸如“未使用的变量”、“初始化列表中的隐藏成员”、“缺少开关默认值”等警告都很重要,但它们在构建过程中会造成太多混乱,并且很难发现重要的警告。
给定一个大型项目,可能会有数以千计的警告与构建语句混合在一起,尽管之后解析它会变得很繁重。在代码中维护编译器编译指示和推送/弹出警告同样是不可取的。
如何以结构化格式转储编译器警告?
无论是 XML、JSON、YAML、CSV,有没有办法告诉编译器转储所有发出的警告?这样的格式可以让我更有效地查看警告,并按类型、文件、数量等对它们进行排序。
-fdiagnostics-format=msvc可以使其输出更加结构化。同时可能对您有所帮助的方法是将您认为重要的编译器警告转变为错误-Werror=,这样您就会注意到它们在警告噪音之上破坏了构建。
GCC 9 添加了[1] 支持以 JSON 格式输出警告和错误消息,只需使用-fdiagnostics-format=json选项。
比较输出
$ gcc-9 -c cve-2014-1266.c -Wall
cve-2014-1266.c: In function ‘SSLVerifySignedServerKeyExchange’:
cve-2014-1266.c:629:2: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
629 | if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
| ^~
cve-2014-1266.c:631:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
631 | goto fail;
| ^~~~
Run Code Online (Sandbox Code Playgroud)
带有 JSON 格式的:
[
{
"children": [
{
"kind": "note",
"locations": [
{
"caret": {
"column": 3,
"file": "cve-2014-1266.c",
"line": 631
},
"finish": {
"column": 6,
"file": "cve-2014-1266.c",
"line": 631
}
}
],
"message": "...this statement, but the latter is misleadingly indented as if it were guarded by the \u2018if\u2019"
}
],
"kind": "warning",
"locations": [
{
"caret": {
"column": 2,
"file": "cve-2014-1266.c",
"line": 629
},
"finish": {
"column": 3,
"file": "cve-2014-1266.c",
"line": 629
}
}
],
"message": "this \u2018if\u2019 clause does not guard...",
"option": "-Wmisleading-indentation"
}
]
Run Code Online (Sandbox Code Playgroud)
[1] https://developers.redhat.com/blog/2019/03/08/usability-improvements-in-gcc-9/