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

jvlzgdj9  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(174)

我一直在处理一个大型的C++程序,在处理C项目时,我忘记添加我通常使用的编译器标志/警告列表。在启用-fanalyzer标志后,我开始收到很多“警告:在我的代码中使用了来自GCC 12.2的未初始化值''”消息。下面是我在编译器资源管理器中生成的一个独立的示例:

#include <string>

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

编译器输出:

<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函数真的有这样的问题吗?还是我遗漏了更大的东西?GCC中的静态分析坏了吗?

puruo6ea

puruo6ea1#

分析器会抱怨任何返回std::string(和其他标准库类型)的函数,例如:

#include <string>

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

https://godbolt.org/z/oKrfrbn5o
令人惊讶的是,我找不到任何关于这个看似明显的问题的以前的bug报告。然而,@JasonLiam已经提交了一个here
-Wanalyzer-use-of-uninitialized-value也是一个相对较新的特性,是GCC 12添加的,所以它可能还需要一些改进。通过添加-Wno-analyzer-use-of-uninitialized-value,可以禁用它,同时保持其他分析器检查有效。
根据链接的bug报告中的开发人员回答,-fanalyzer目前无法在C中正常工作,因此不建议在C代码中使用。跟踪C++问题的 metabug可以在here中找到。

相关问题