2017-01-07 42 views
1

我正在嘗試編寫一個接收消息並讀取它們的程序。根據這些消息是什麼,然後打印出一些文本。因爲這是valgrind警告我的代碼的一部分,所以我把它留在那裏讓你看。據我在網上閱讀,應該有一個初始化問題,但我不知道在哪裏。Valgrind錯誤:條件跳轉或移動取決於未初始化的值(s) - 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'; 

而所定義的陣列分別2555250,要長度。有效訪問是索引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

我在if之前調用mq_getattr一行。這還不夠嗎?我怎麼寫呢? – KatKit

相關問題