为什么 GCC 给我一个使用未初始化值的警告?

dyl*_*ber 7 c++ gcc static-analysis

我一直在开发一个大型 C++ 程序,但在处理 C 项目时忘记添加常用的编译器标志/警告列表。启用该-fanalyzer标志后,我开始在整个代码中收到来自 GCC 12.2 的大量“警告:使用未初始化值 '<unknown>'”消息。这是我能够在编译器资源管理器中生成的一个单独的示例:

#include <string>

std::string square(int num) {
    return std::to_string(num * num);
}
Run Code Online (Sandbox Code Playgroud)

编译器输出:

<source>: In function 'std::string square(int)':
<source>:4:36: warning: use of uninitialized value '<unknown>' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
    4 |     return std::to_string(num * num);
      |                                    ^
  'std::string square(int)': events 1-2
    |
    |    3 | std::string square(int num) {
    |      |                           ^
    |      |                           |
    |      |                           (1) region created on stack here
    |    4 |     return std::to_string(num * num);
    |      |                                    ~
    |      |                                    |
    |      |                                    (2) use of uninitialized value '<unknown>' here
    |
<source>:4:36: warning: use of uninitialized value '<unknown>' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
    4 |     return std::to_string(num * num);
      |                                    ^
  'std::string square(int)': events 1-2
    |
    |    3 | std::string square(int num) {
    |      |                           ^
    |      |                           |
    |      |                           (1) region created on stack here
    |    4 |     return std::to_string(num * num);
    |      |                                    ~
    |      |                                    |
    |      |                                    (2) use of uninitialized value '<unknown>' here
    |
Run Code Online (Sandbox Code Playgroud)

这个简单的square功能真的有这样的问题吗?或者我错过了更大的东西?GCC 中的静态分析是否已损坏?

use*_*522 6

这显然是误报。分析器抱怨任何返回 a std::string(和其他标准库类型)的函数,例如

#include <string>

std::string f() {
    return {};
}
Run Code Online (Sandbox Code Playgroud)

以及。(https://godbolt.org/z/oKrfrbn5o

令人惊讶的是,我找不到任何以前关于这个看似明显的问题的错误报告。然而,@JasonLiam 已在这里提交了一份文件。

-Wanalyzer-use-of-uninitialized-value也是一个相对较新的功能,是在 GCC 12 中添加的,因此它可能仍然需要一些改进。可以通过添加 来禁用它,同时使其他分析器检查保持有效-Wno-analyzer-use-of-uninitialized-value

事实证明,每个开发人员在链接的错误报告中的回答-fanalyzer目前无法在 C++ 上正常工作,并且不建议在 C++ 代码上使用。可以在此处找到跟踪 C++ 问题的元错误。