gpt4 book ai didi

c++ - Clang 不报告 C++ 中未初始化的变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:35 24 4
gpt4 key购买 nike

据我所知,局部变量在 C++ 中不会自动初始化,因此在使用它们之前,您应该始终为它们赋值。然而,至少在简单的情况下,编译器应该警告你以防你忘记它。我或多或少依赖和引用this article .

鉴于此程序,我假设在将 x 发送到 std::cout 时收到警告...

#include <iostream>

int main(int argc, const char * argv[])
{

int x;
std::cout << x;

return 0;
}

...但没有弹出警告。但是,如果我运行静态分析器,我会得到预期的警告:函数调用参数是一个未初始化的值

我使用 Xcode 5.1 和 Apple LLVM 5.1 编译器编译和运行。我使用 Xcode 命令行项目模板 (C++) 中的标准build设置,语言方言设置为 GNU99(对于 C)和 GNU++11 (C++)。

Uninitialized Variables 选项设置为Yes (Aggressive) (-Wconditional-uninitialized)。仅切换到 Yes (-Wuninitialized) 会引发警告:变量“x”在此处使用时未初始化问题第 1 部分:为什么默认设置 (-Wconditional-uninitialized) 不显示警告? Xcode 中的文档表明积极的选项会发现更多问题:

You can toggle between the normal uninitialized value checking or the more aggressive (conservative) checking which finds more issues but the checking is much stricter.

奇怪的是,当我运行程序时,该值总是设置为0,因此由于某种原因,它似乎被初始化了。 问题第 2 部分:这是为什么?

最佳答案

  1. 为什么不是警告?

在我的系统上将 clang-Wall 一起使用会正确警告错误。显然,默认设置不包括 -Wall(可能是为了避免使用在引入某些警告之前编写的正确代码生成警告)。

一般来说,如果您依靠编译器来帮助您进行草率的编程,您将会遇到麻烦。在没有仔细考虑的情况下输入代码并希望编译器会告诉您所有错误在任何语言中都是不好的,但在 C++ 中却是真正的灾难。 C++ 的主要理念很简单,就是程序员不会犯任何错误,所以就不要犯错误 ;-)

如果可以的话,请仔细考虑并始终使用 -Wall

  1. 为什么要初始化?

显然,您还没有理解“未定义行为”的含义。这并不意味着程序崩溃,也不意味着它会做任何有趣的事情。这意味着它可以做任何事情,通常情况下程序会做任何会在未来给你带来最多问题的事情。

通常这种最危险的行为是让它看起来好像一切都很好(例如,您的变量确实已初始化)。只有当您将该代码投入生产或仅当您向大量观众展示您的程序运行时,不良值才会显示出来。到那时,值(value)就会不同,你的公开撞车视频会在 youtube 上疯传,你的妻子会更换门锁,甚至你的 parent 也不会接听你的电话。

只需初始化您的变量;更好:-)

关于c++ - Clang 不报告 C++ 中未初始化的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com