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) { ... } 时, 两个分支都被考虑