如何将 gcc 警告转储为结构化格式?
How do I dump gcc warnings into a structured format?
像许多人一样,我在构建项目时带有大量警告标志。
由于并非所有警告标志都是有害的,因此编译变得嘈杂。
诸如 "unused variables"、"shadowing members in initialization lists"、"missing switch defaults" 之类的警告对日志记录都很重要,但它们在构建过程中造成了太多混乱,并且很难发现重要警告.
给定一个大项目,构建语句中可能混杂着数以千计的警告,之后的解析变得很麻烦。同样不希望在代码中维护编译器编译指示和 push/pop 警告。
如何以结构化格式转储编译器警告?
无论是
XML、JSON、YAML、CSV,有没有办法告诉编译器转储所有发出的警告?这样的格式可以让我更有效地查看警告,并按类型、文件、数量等对它们进行排序。
- coala project attempts to make the tools it wraps produce the same structured output formats (see http://wordpress.schuirmann.eu/2016/02/coala-at-fosdem-2016/#comment-123)。可悲的是,似乎没有已经制作好的 "bear" 来包装编译器。
- 与上述类似,Ericsson 构建了一个名为 CodeChecker 的工具,可让您随时间跟踪项目的 clang 静态分析警告。
- 有一个名为 firehose 的垂死项目包装了 gcc 和几个 C 静态分析工具的输出。
- clang has
-fdiagnostics-format=msvc
可以使其输出 稍微 更加结构化。
在此期间可能对您有帮助的是 turn those compiler warnings you deem critical into errors using -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;
| ^~~~
与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"
}
]
[1] https://developers.redhat.com/blog/2019/03/08/usability-improvements-in-gcc-9/
像许多人一样,我在构建项目时带有大量警告标志。
由于并非所有警告标志都是有害的,因此编译变得嘈杂。
诸如 "unused variables"、"shadowing members in initialization lists"、"missing switch defaults" 之类的警告对日志记录都很重要,但它们在构建过程中造成了太多混乱,并且很难发现重要警告.
给定一个大项目,构建语句中可能混杂着数以千计的警告,之后的解析变得很麻烦。同样不希望在代码中维护编译器编译指示和 push/pop 警告。
如何以结构化格式转储编译器警告?
无论是
XML、JSON、YAML、CSV,有没有办法告诉编译器转储所有发出的警告?这样的格式可以让我更有效地查看警告,并按类型、文件、数量等对它们进行排序。
- coala project attempts to make the tools it wraps produce the same structured output formats (see http://wordpress.schuirmann.eu/2016/02/coala-at-fosdem-2016/#comment-123)。可悲的是,似乎没有已经制作好的 "bear" 来包装编译器。
- 与上述类似,Ericsson 构建了一个名为 CodeChecker 的工具,可让您随时间跟踪项目的 clang 静态分析警告。
- 有一个名为 firehose 的垂死项目包装了 gcc 和几个 C 静态分析工具的输出。
- clang has
-fdiagnostics-format=msvc
可以使其输出 稍微 更加结构化。
在此期间可能对您有帮助的是 turn those compiler warnings you deem critical into errors using -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;
| ^~~~
与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"
}
]
[1] https://developers.redhat.com/blog/2019/03/08/usability-improvements-in-gcc-9/