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=]';

而您将数组的长度分别定义为 2555250。有效访问是索引 0size-1.

在这里,您正在访问调用 undefined behavior 的绑定内存。一旦你达到了 UB,就没有什么可以保证的了。

加上别人指出的错误:

如果(atr.mq_curmsgs>0)

上面的代码将导致 valgrind 抱怨未初始化值的条件跳转,因为您没有为 atr.mq_curmsgs 赋值,除非它是在调用 mq_getattr(oprimek ,&atr).

我写

解决了这个问题
memset(msg,0,sizeof(msg))

声明正下方。