KatKit
KatKit

Reputation: 31

Valgrind error: conditional jump or move depends on uninitialised value(s) - C

I am trying to write a program that receives messages and reads them. Based on what those messages are it then prints out some text. As that is the part of the code that valgrind is warning me about, I left it there for you to see. As far as I read online, there is supposed to be an initialization problem but I do not know where.

int main(int argc, char* argv[])
{
    int oprimek = 0;
    char name[] = "/cmdQueue";
    char msg[255];
    msg[256]='\0';
    char submsg1[5];
    submsg1[6]='\0';
    char submsg2[250];
    submsg2[251]='\0';
    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]='\0';
            strncpy(submsg1,msg,5);
            submsg1[5]='\0';
            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;
}

Upvotes: 2

Views: 1381

Answers (3)

KatKit
KatKit

Reputation: 31

I solved the issue by writing

memset(msg,0,sizeof(msg))

right under the declaration.

Upvotes: 1

FredK
FredK

Reputation: 4084

In addition to the errors pointed out by others:

if(atr.mq_curmsgs>0)

the above code will cause valgrind to complain about a conditional jump on an uninitialized value since you have not assigned a value to atr.mq_curmsgs, unless it is done in the call to mq_getattr(oprimek,&atr).

Upvotes: 0

Sourav Ghosh
Sourav Ghosh

Reputation: 134396

The bigger problem, as I see it is with

 msg[256]='\0';
 submsg1[6]='\0';
 submsg2[251]='\0';

whereas you defined the arrays to be of length 255, 5 and 250, respectively. The valid access is for index 0 to size-1.

Here, you're accessing out of bound memory which invokes undefined behavior. Nothing is guaranteed once you hit UB.

Upvotes: 5

Related Questions