Valgrind error: conditional jump or move depends on uninitialised value(s) - C
Valgrind error: conditional jump or move depends on uninitialised value(s) - C
我正在尝试编写一个程序来接收消息并读取它们。然后根据这些消息是什么打印出一些文本。由于这是 valgrind 警告我的代码部分,我将其留在那里供您查看。据我在网上阅读,应该是初始化问题,但我不知道在哪里。
int main(int argc, char* argv[])
{
int oprimek = 0;
char name[] = "/cmdQueue";
char msg[255];
msg[256]='[=10=]';
char submsg1[5];
submsg1[6]='[=10=]';
char submsg2[250];
submsg2[251]='[=10=]';
int len=0;
int x=0;
struct mq_attr atr;
atr.mq_maxmsg = 5;
atr.mq_msgsize = 255;
oprimek = mq_open(name,O_RDWR|O_CREAT|O_EXCL,0660, &atr);
if(oprimek == -1){
perror("error");
mq_unlink(name);
return -1;
}
time_t sek;
int size=0;
while(1){
mq_getattr(oprimek,&atr);
if(atr.mq_curmsgs>0){
size=mq_receive(oprimek, msg, atr.mq_msgsize,0);
if(size==0){
printf("Length is 0.");
}else{
len=strlen(msg);
msg[len]='[=10=]';
strncpy(submsg1,msg,5);
submsg1[5]='[=10=]';
if(strcmp(msg, "datum")==0){
time(&sek);
printf("%s", ctime(&sek));
}
else if(strcmp(submsg1,"izpis")==0){
x=0;
while(x<len){
submsg2[x]=msg[5+x+1];
x++;
}
printf("%s\n",submsg2);
}
else if(strcmp(msg,"zakljuci")==0){
printf("Turning off!\n");
return 1;
}
else{
printf("Unknown message: %s \n",msg);
}
}
}
}
mq_close(oprimek);
mq_unlink(name);
return 0;
}
更大的问题,正如我所见,
msg[256]='[=10=]';
submsg1[6]='[=10=]';
submsg2[251]='[=10=]';
而您将数组的长度分别定义为 255
、5
和 250
。有效访问是索引 0
到 size-1.
在这里,您正在访问调用 undefined behavior 的绑定内存。一旦你达到了 UB,就没有什么可以保证的了。
加上别人指出的错误:
如果(atr.mq_curmsgs>0)
上面的代码将导致 valgrind 抱怨未初始化值的条件跳转,因为您没有为 atr.mq_curmsgs 赋值,除非它是在调用 mq_getattr(oprimek ,&atr).
我写
解决了这个问题
memset(msg,0,sizeof(msg))
声明正下方。
我正在尝试编写一个程序来接收消息并读取它们。然后根据这些消息是什么打印出一些文本。由于这是 valgrind 警告我的代码部分,我将其留在那里供您查看。据我在网上阅读,应该是初始化问题,但我不知道在哪里。
int main(int argc, char* argv[])
{
int oprimek = 0;
char name[] = "/cmdQueue";
char msg[255];
msg[256]='[=10=]';
char submsg1[5];
submsg1[6]='[=10=]';
char submsg2[250];
submsg2[251]='[=10=]';
int len=0;
int x=0;
struct mq_attr atr;
atr.mq_maxmsg = 5;
atr.mq_msgsize = 255;
oprimek = mq_open(name,O_RDWR|O_CREAT|O_EXCL,0660, &atr);
if(oprimek == -1){
perror("error");
mq_unlink(name);
return -1;
}
time_t sek;
int size=0;
while(1){
mq_getattr(oprimek,&atr);
if(atr.mq_curmsgs>0){
size=mq_receive(oprimek, msg, atr.mq_msgsize,0);
if(size==0){
printf("Length is 0.");
}else{
len=strlen(msg);
msg[len]='[=10=]';
strncpy(submsg1,msg,5);
submsg1[5]='[=10=]';
if(strcmp(msg, "datum")==0){
time(&sek);
printf("%s", ctime(&sek));
}
else if(strcmp(submsg1,"izpis")==0){
x=0;
while(x<len){
submsg2[x]=msg[5+x+1];
x++;
}
printf("%s\n",submsg2);
}
else if(strcmp(msg,"zakljuci")==0){
printf("Turning off!\n");
return 1;
}
else{
printf("Unknown message: %s \n",msg);
}
}
}
}
mq_close(oprimek);
mq_unlink(name);
return 0;
}
更大的问题,正如我所见,
msg[256]='[=10=]';
submsg1[6]='[=10=]';
submsg2[251]='[=10=]';
而您将数组的长度分别定义为 255
、5
和 250
。有效访问是索引 0
到 size-1.
在这里,您正在访问调用 undefined behavior 的绑定内存。一旦你达到了 UB,就没有什么可以保证的了。
加上别人指出的错误:
如果(atr.mq_curmsgs>0)
上面的代码将导致 valgrind 抱怨未初始化值的条件跳转,因为您没有为 atr.mq_curmsgs 赋值,除非它是在调用 mq_getattr(oprimek ,&atr).
我写
解决了这个问题memset(msg,0,sizeof(msg))
声明正下方。