如何将 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,有没有办法告诉编译器转储所有发出的警告?这样的格式可以让我更有效地查看警告,并按类型、文件、数量等对它们进行排序。

在此期间可能对您有帮助的是 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/