Я пытаюсь написать программу, которая получает сообщения и читает их. Исходя из того, что это за сообщения, он печатает текст. Поскольку это часть кода, о котором меня предупреждает valgrind, я оставил ее там для вас. Насколько я читаю в Интернете, предполагается, что проблема с инициализацией, но я не знаю, где.Ошибка Valgrind: условный переход или перемещение зависит от неинициализированного значения (-ов) - C
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;
}
Вы должны действительно проверить границы массива. Вы пишете вне их во многих местах. Например, 'char msg [255]; msg [256] = '\ 0'; '. Вы определили массив с 255 элементами, первый начнете msg [0], а последний - msg [254]. Между тем вы назначаете значение msg [256], которое находится за пределами границ массива. Это может привести к сбою сегментации, когда вы записываете в память, не назначенную для вашей программы. или он может записать в другую память, назначенную для вашей программы, что может привести к неопределенному поведению. –
Этот код 'len = strlen (msg); msg [len] = '\ 0'; 'бесполезно, так как' strlen' не может работать без обязательного ограничителя строк в этой позиции. –
Благодарим за помощь. Я исправил массивы, но ошибка все еще здесь. – KatKit