【发布时间】: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