繁体   English   中英

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

[英]Why is GCC giving me a use of uninitialized value warning?

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

#include <string>

std::string square(int num) {
    return std::to_string(num * num);
}

编译器 output:

<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
    |

这个简单的square function真的有这样的问题吗? 还是我错过了更大的东西? GCC中的static分析是不是坏了?

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

#include <string>

std::string f() {
    return {};
}

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

令人惊讶的是,我找不到关于这个看似显而易见的问题的任何以前的错误报告。 但是,@JasonLiam 已在此处提交了一份。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM