【问题标题】:valgrind realloc error: Conditional jump or move depends on uninitialised value(s)valgrind realloc 错误:条件跳转或移动取决于未初始化的值
【发布时间】:2015-10-20 21:09:26
【问题描述】:
==17209== Conditional jump or move depends on uninitialised value(s)
==17209==    at 0x402E7C5: __GI___rawmemchr (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==17209==    by 0x40CE921: _IO_str_init_static_internal (strops.c:45)
==17209==    by 0x40B0B76: __isoc99_vsscanf (isoc99_vsscanf.c:42)
==17209==    by 0x8048647: main (lala.c:23)
==17209==  Uninitialised value was created by a stack allocation
==17209==    at 0x8048659: gatherInfoSalt (lala.c:28)
==17209== 

.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <string.h>
#include <unistd.h>
#include <errno.h>


struct sysinfo_s {
    char *salt_id;
};


void gatherInfoSalt(char ** );

int main (int argc, char *argv[]) {
    struct sysinfo_s si;

    si.salt_id = malloc(1);
    *si.salt_id = 0;

    gatherInfoSalt(&si.salt_id);

    free(si.salt_id);
}

void gatherInfoSalt(char ** salt_id) {
    FILE * fp;
    char buf[256];
    int r;


    if (!(fp = fopen("/etc/salt/minion.d/id.conf","r"))) {
            perror("fopen");
        return;
    }

    r=fread(buf,1,255,fp);

    //adding *buf=0 here removes the error (but removes functionality)

    if (r) {
        *salt_id=realloc(*salt_id,r-2);
        **salt_id=0;
        sscanf(buf,"id:%s",*salt_id);
        //sscanf(buf,"id:%s",buf1);
    }

    printf("saltid: %s\n",*salt_id);

    fclose(fp);

}

【问题讨论】:

  • r 的值是多少?你确定它已经初始化了吗?
  • 是的。有一个 r=fread(); if(r) { **salt_id=realloc()...}。我刚刚发现只是注释掉 sscanf 出于某种原因删除了错误。
  • buf的内容来自...? 请发布 MCVE。看在上帝的份上,检查您的 IO 调用结果
  • 我用上一部分更新了代码。代码运行良好。
  • @WhozCraig 在 fread 后添加 *buf=0 会消除 valgrind 错误,但会破坏功能

标签: c reference stack valgrind realloc


【解决方案1】:

这个

r=fread(buf,1,255,fp);
sscanf(buf,"id:%s",....

应该是:

  r=fread(buf,1,255,fp);
  buf[r]=0;
  sscanf(buf,"id:%s",....

【讨论】:

    【解决方案2】:

    在声明时初始化buf,或者在fread之前将其memset为0。

    【讨论】:

    • 是的,memset 也可以,不过我更喜欢只设置 1 个字节。谢谢。
    猜你喜欢
    • 2021-03-02
    • 2011-05-06
    • 2011-12-09
    • 2017-01-11
    • 2011-04-18
    • 2016-07-24
    • 2014-11-30
    相关资源
    最近更新 更多