Valgrind C/C++ 栈外使用的栈分配创建的未初始化值
Valgrind C/C++ Unitialized value created by stack allocation used outside the stack
我在 valgrind memcheck 中有一个奇怪的发现,我无法共享整个代码(庞大且专有),但这是一个简化版本:
Conditional jump or move depends on uninitialised value(s)
func2(modu2.c:12631)
func1(modu1.c:1808)
main(main.c:1808)
Uninitialised value was created by a stack allocation
func1_1(modu1.c:691)
func1_1 在 func1 内部调用,堆栈分配创建的所有变量都应该在函数末尾删除,func2 永远不会在 func1_1.[=13 内部调用(三次检查) =]
问题 1:除了 Valgrind 发疯之外,还有其他合理的解释吗?某些构建 flags/configuration 会触发此类问题吗?
此外,在 func2 中,代码如下所示:
void func2(var input)
{
var tmp = 0;
tmp = input.x + input.y;
if(tmp < 100) // here was the use
doStuff();
}
问题 2:tmp 已明确初始化,如果 input.x 未初始化,Valgrind 能否发送调查结果?两个都? Valgrind 疯了?
非常感谢,这个问题让我抓狂,我正在推动工具成为流程的一部分,但我必须证明它是可靠的。
考虑以下示例,其中 tmp
在某种意义上被初始化:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct { int x; int y; } Point;
void foo(const Point *p)
{
int tmp = p->x;
Point *q = new Point;
if (tmp < 742) { delete q; delete q; }
}
int main(int argc, char **argv)
{
Point p;
// p.x = 1000;
foo(&p);
return 0;
}
Valgrind 发出有效错误,因为 tmp
取决于
p.x
的值 未 已初始化:
$ g++ -g -O0 main.cpp -o main
$ valgrind ./main
==27183== Memcheck, a memory error detector
==27183== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==27183== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==27183== Command: ./main
==27183==
==27183== Conditional jump or move depends on uninitialised value(s)
==27183== at 0x108774: foo(Point const*) (main7.cpp:10)
==27183== by 0x1087C4: main (main7.cpp:17)
==27183==
==27183== Invalid free() / delete / delete[] / realloc()
...
==27183== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
当我删除注释并初始化 p.x
时一切正常。
所以对你来说简短的回答是 是的,valgrind 使用的分析是
使他能够监视未初始化的变量,并在 上传播这些值。
当遇到具有未初始化值的 exp 的 if (exp) { ... }
时,
两个分支都被考虑
我在 valgrind memcheck 中有一个奇怪的发现,我无法共享整个代码(庞大且专有),但这是一个简化版本:
Conditional jump or move depends on uninitialised value(s)
func2(modu2.c:12631)
func1(modu1.c:1808)
main(main.c:1808)
Uninitialised value was created by a stack allocation
func1_1(modu1.c:691)
func1_1 在 func1 内部调用,堆栈分配创建的所有变量都应该在函数末尾删除,func2 永远不会在 func1_1.[=13 内部调用(三次检查) =]
问题 1:除了 Valgrind 发疯之外,还有其他合理的解释吗?某些构建 flags/configuration 会触发此类问题吗?
此外,在 func2 中,代码如下所示:
void func2(var input)
{
var tmp = 0;
tmp = input.x + input.y;
if(tmp < 100) // here was the use
doStuff();
}
问题 2:tmp 已明确初始化,如果 input.x 未初始化,Valgrind 能否发送调查结果?两个都? Valgrind 疯了?
非常感谢,这个问题让我抓狂,我正在推动工具成为流程的一部分,但我必须证明它是可靠的。
考虑以下示例,其中 tmp
在某种意义上被初始化:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct { int x; int y; } Point;
void foo(const Point *p)
{
int tmp = p->x;
Point *q = new Point;
if (tmp < 742) { delete q; delete q; }
}
int main(int argc, char **argv)
{
Point p;
// p.x = 1000;
foo(&p);
return 0;
}
Valgrind 发出有效错误,因为 tmp
取决于
p.x
的值 未 已初始化:
$ g++ -g -O0 main.cpp -o main
$ valgrind ./main
==27183== Memcheck, a memory error detector
==27183== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==27183== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==27183== Command: ./main
==27183==
==27183== Conditional jump or move depends on uninitialised value(s)
==27183== at 0x108774: foo(Point const*) (main7.cpp:10)
==27183== by 0x1087C4: main (main7.cpp:17)
==27183==
==27183== Invalid free() / delete / delete[] / realloc()
...
==27183== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
当我删除注释并初始化 p.x
时一切正常。
所以对你来说简短的回答是 是的,valgrind 使用的分析是
使他能够监视未初始化的变量,并在 上传播这些值。
当遇到具有未初始化值的 exp 的 if (exp) { ... }
时,
两个分支都被考虑