簡體   English   中英

為什么valgrind在復制未初始化的數據時不會抱怨?

[英]Why doesn't valgrind complain when copying uninitialized data?

根據手冊,它不會:

重要的是要了解您的程序可以隨意復制垃圾數據(未初始化的數據)。 Memcheck會觀察到這一點並跟蹤數據,但不會抱怨。 僅當您的程序試圖以可能會影響程序的外部可見行為的方式使用未初始化的數據時,才會發出投訴。

問題是,是否存在一些重要的行為方式? 是否有(通常)使用的構造會復制未初始化的數據,從而觸發誤報? 還是有辦法讓valgrind對此抱怨?

我擔心的是,在C語言中,未初始化變量的使用具有未定義的行為(IIRC),因此,例如,以下函數可能會發出nasal守護程序:

int fubar(void) {
     int a;

     return a;
}

現在我回想起來不正確,只是在某些情況下它是未定義的,例如,如果您正在使用未初始化的變量進行算術運算:

int fubar(void) {
    int a;

    a -= a;
    return a;
}

因此,這里也會出現同樣的問題。 valgrind允許使用未初始化的數據進行運算有一些重要的原因嗎? 請注意,尤其是如果它們是浮點數據,則實際上可能會更改外部可觀察到的行為,因為可能啟用了捕獲FP錯誤的陷阱。

是的,這種情況經常發生。 例如:

struct {
    char a;
    int b;
} s1, s2;

s1.a = '.';
s1.b = 31337;

memcpy (&s2, &s1, sizeof(s1));

在這里,您正在復制未初始化的字節( ab之間的填充字節)。

我認為valgrind在這里不要抱怨是一件好事。

一般說來(針對您的算術示例):

當未初始化的數據可能導致程序的不確定行為時,Valgrind會嘗試進行投訴。 或者反過來:它抱怨,如果能夠排除這種情況。 因此,例如,當branch或syscall參數取決於未初始化的數據時,valgrind會抱怨。 您可以通過將exit(a)放在a -= a;后來a -= a;嘗試a -= a; ,結果

Syscall param exit_group(status) contains uninitialised byte(s)

即使通常在任何情況下結果都是0。 (您可能必須聲明a volatile以防止將其從代碼中刪除)

暫無
暫無

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

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