2017-01-07 7 views
1

Я пытаюсь написать программу, которая получает сообщения и читает их. Исходя из того, что это за сообщения, он печатает текст. Поскольку это часть кода, о котором меня предупреждает 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; 
} 
+1

Вы должны действительно проверить границы массива. Вы пишете вне их во многих местах. Например, 'char msg [255]; msg [256] = '\ 0'; '. Вы определили массив с 255 элементами, первый начнете msg [0], а последний - msg [254]. Между тем вы назначаете значение msg [256], которое находится за пределами границ массива. Это может привести к сбою сегментации, когда вы записываете в память, не назначенную для вашей программы. или он может записать в другую память, назначенную для вашей программы, что может привести к неопределенному поведению. –

+2

Этот код 'len = strlen (msg); msg [len] = '\ 0'; 'бесполезно, так как' strlen' не может работать без обязательного ограничителя строк в этой позиции. –

+0

Благодарим за помощь. Я исправил массивы, но ошибка все еще здесь. – KatKit

ответ

1

Я решил проблему, написав

memset(msg,0,sizeof(msg)) 

прямо под декларацией.

+0

Вы должны направить свой ответ в качестве принятого ответа, чтобы люди знали, что вопрос решен. :) –

5

Большая проблема, как я вижу это с

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

, тогда как вы определили массивы иметь длину 255, 5 и 250 соответственно. Допустимый доступ для индекса 0 до размер-1.

Здесь вы получаете доступ из связанной памяти, которая вызывает undefined behavior. Когда вы нажимаете UB, ничего не гарантируется.

+0

тот же самый с 'char submsg2 [ 250]; submsg2 [251] = '\ 0'; 'и' char msg [255]; msg [256] = '\ 0'; 'также –

+1

@LudvigRydahl Право, обновлено, хотя попытка состояла в том, чтобы Получите эту идею. :) –

+0

Я сделал, как вы и предполагали, но проблема все та же. – KatKit

0

В дополнении к ошибкам указывались другими:

если (atr.mq_curmsgs> 0)

выше код заставит Valgrind жаловаться условным переходом на неинициализированном значении, так как вы не имеете присвоено значение atr.mq_curmsgs, если это не сделано в вызове mq_getattr (oprimek, & atr).

+0

Я вызываю mq_getattr на одну строку до if. Этого недостаточно? как shouoldЯ напишу это вместо этого? – KatKit

 Смежные вопросы

  • Нет связанных вопросов^_^