【发布时间】:2013-08-30 09:47:47
【问题描述】:
我有这段代码,
#include <iostream>
void foo(int *a)
{
std::cout<<*a<<std::endl;
}
int main()
{
int i;
foo(&i);
}
很明显正在使用未初始化的变量。
我尝试过/RTCu 以及依赖error C4700,但是对于上面的代码,编译器并没有将其标记为错误。
我也尝试运行代码分析,它报告为代码片段没有问题。
那么在我们的源代码中确定未初始化变量的可靠方法是什么?
我知道valgrind 在这里做了出色的工作,但它不是我的选择,因为我有很多对 Windows API 和 MFC 的调用。
【问题讨论】:
-
这对您来说是“明显的”,但对编译器却不是:您通过指针间接将变量传递给(非内联)函数(请注意,使函数内联并启用内联确实会触发gcc 警告)。现在,不是答案,而是为什么要首先定义未初始化的变量?避免问题的一种简单方法是在定义变量时始终对其进行初始化(这意味着在您可以初始化之前不要定义它)。
-
@gx_:我不是在定义未初始化的变量,而是在清理代码库中可能存在的问题。我也不同意
It is "evident" to you but not to the compiler。为了证明我的观点,我必须在上面的代码库上运行 Valgrind 并确定它的响应。 -
感谢您的回复(我曾怀疑“不是我的代码”,但精确它不需要任何成本)。但我坚持认为,这对于编译器来说显然是不;如果是,它会警告它(使
fooinline 和 then 它对编译器来说变得很明显)。 valgrind 也不是编译器也不是静态分析工具,而是 dynamic 检查器。 -
指针有效,因此 /RTCu 结束。在这种情况下,您依赖 /RTC,值 -858993460 明显突出。
-
您将项目警告级别设置为什么?在项目属性 -> 配置属性 -> C/C++ -> 常规 -> 警告级别下。尝试将其设置为 Level 4 或 All 并重新编译。在某些情况下,编译器会捕获正在使用的未初始化变量,但不是全部。
标签: c++ visual-c++ visual-studio-2012 code-analysis initialization