c - 这个函数中未初始化的值在哪里?

标签 c memory stack valgrind

我正在 valgrind 中运行我的 C 二进制文件的调试版本,它会返回许多类型的错误 Conditional jump or move depends on uninitialised value(s)

使用符号表,valgrind 告诉我在我的程序中的何处查找此问题:

==23899== 11 errors in context 72 of 72:                                                                                                                                                                                                     
==23899== Conditional jump or move depends on uninitialised value(s)                                                                                                                                                                         
==23899==    at 0x438BB0: _int_free (in /foo/bar/baz)                                                                                                                         
==23899==    by 0x43CF75: free (in /foo/bar/baz)                                                                                                                              
==23899==    by 0x4179E1: json_tokener_parse_ex (json_tokener.c:593)                                                                                                                                                                         
==23899==    by 0x418DC8: json_tokener_parse (json_tokener.c:108)                                                                                                                                                                            
==23899==    by 0x40122D: readJSONMetadataHeader (metadataHelpers.h:345)                                                                                                                                                               
==23899==    by 0x4019CB: main (baz.c:90)

我有以下调用 json_tokener_parse() 的函数 readJSONMetadataHeader(...):

int readJSONMetadataHeader(...) {                                                                                                                                                                                                                                                                                                                                                                 
    char buffer[METADATA_MAX_SIZE];
    json_object *metadataJSON;
    int charCnt = 0; 
    ...
    /* fill up the `buffer` variable here; basically a */
    /* stream of characters representing JSON data...  */
    ...
    /* terminate `buffer` */
    buffer[charCnt - 1] = '\0';
    ...
    metadataJSON = json_tokener_parse(buffer);
    ...
}

函数json_tokener_parse()依次如下:

struct json_object* json_tokener_parse(const char *str)                                                                                                                                                                                      
{                                                                                                                                                                                                                                            
    struct json_tokener* tok;                                                                                                                                                                                                                  
    struct json_object* obj;                                                                                                                                                                                                                   

    tok = json_tokener_new();                                                                                                                                                                                                                  
    obj = json_tokener_parse_ex(tok, str, -1);                                                                                                                                                                                                 
    if(tok->err != json_tokener_success)                                                                                                                                                                                                       
        obj = (struct json_object*)error_ptr(-tok->err);                                                                                                                                                                                         
    json_tokener_free(tok);                                                                                                                                                                                                                    
    return obj;                                                                                                                                                                                                                                
}

追溯至 readJSONMetadataHeader(),似乎未初始化的值是 char [](或 const char *)被馈送到 json_tokener_parse() 的变量 buffer,后者又被馈送到 json_tokener_parse_ex()

但是 buffer 变量被数据填充,然后在调用 json_tokener_parse() 函数之前终止。

那么为什么 valgrind 说这个值是未初始化的?我错过了什么?

最佳答案

从 valgrind 错误报告来看,您的应用程序似乎是静态链接的(特别是,free 似乎在主可执行文件中,而不是 libc.so.6).

Valgrind 将报告静态链接应用程序的虚假错误。

更准确地说,libc 中有故意的“无关”错误。当您动态链接应用程序时,默认情况下会抑制此类错误(通过 Valgrind 附带的抑制文件)。

但是当您静态链接您的应用程序时,Valgrind 不知道错误代码来自 libc.a,因此它会报告它们。

通常,在 Linux 上静态链接应用程序是一个坏主意 (TM)。

在 Valgrind 下运行这样的应用程序:双重如此:Valgrind 将无法拦截 malloc/free 调用,并且将有效地捕获 未初始化的内存读取,并且不是它通常擅长的堆缓冲区溢出(或其他堆损坏错误)。

关于c - 这个函数中未初始化的值在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8623966/

相关文章:

c - 在 C 函数中需要 "nmem"和 "size"参数吗?

c++ - 在 CUDA 中高效地初始化共享内存阵列

c++ - 我如何找出可用堆栈空间的大小?

c - 我猜函数有一些错误

c - 使用指针从函数返回值的正确方法

r - 以交互方式处理占用大量内存的列表对象

c++ - 如何知道返回地址在栈上的位置c/c++

c++ - "All memory allocated on the stack is known at compile time"是什么意思?

c - 返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

c - .c 文件什么时候应该没有关联的 .h 文件?