簡體   English   中英

為什么Valgrind抱怨printf而不是我的未初始化的計數器?

[英]Why is Valgrind complaining about printf instead of my uninitialized counter?

我剛剛開始使用Valgrind,我不確定我得到的錯誤消息是他們應該是什么。 例如,Valgrind給了我一個很長的警告鏈,關於printf()根據未初始化的內存進行跳轉。 顯然問題不在於printf() 相反,我的程序給了printf()污染的內存。

我設法生產了以下MCVE:

#include <stdio.h>

int main(void)
{
    int d;
    d++;
    printf("%d\n", d);
    return 0;
}

很明顯,這里的問題在於d++ 但是,Valgrind只檢測並警告我下一行中未初始化的內存使用情況,表單中有6條消息

== 12178 ==條件跳轉或移動取決於未初始化的值(s)
== 12178 ==在0x4E7F79D:vfprintf(vfprintf.c:1636)
== 12178 == by 0x4E871F8:printf(printf.c:33)
== 12178 == by 0x1086D1:main(mcve.c:7)

我編譯了這個

gcc mcve.c -g -O0

我和Valgrind跑了

valgrind --leak-check = yes ./a.out

然后我發現有--track-origins=yes 它試圖提供幫助,但它很容易被指針迷失。 例如,它不適用於下一個MCVE:

#include <stdio.h>

int f2(int *p)
{
    (*p)++;
    return *p;
}

int f1(void)
{
    int d;
    return f2(&d);
}

int main(void)
{
    printf("%d\n", f1());
    return 0;
}

這里它說錯誤是在f1()的堆棧幀中。 它有點幫助,但考慮到所涉及的性能損失,也許它不值得。

我能做些什么來充分利用Valgrind?

Valgrind的一個深思熟慮的決定是,它不會因為某些未初始化的內存被復制或類似抱怨。 只有當使用未初始化的內存改變程序的行為時,它才會抱怨。 這種刻意的選擇避免了許多誤報錯誤。

有關更多信息,請參閱http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.uninitvals

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM