2017-04-06 58 views
0

因此,在main.c中,我得到了這部分代碼,它打印加密的內容,如果它不爲空。它非常簡單。C:Cppcheck:可能的零點取消引用

CPP的錯誤是:

[main.c中:40]:(誤差)可能的空指針:加密 - 否則它是多餘的,以檢查是否加密是在管線31

代碼:

char* encrypted = bmp_encrypt(key, text); 
    if(encrypted != NULL) //error points here (line 31) 
    { 
     printf("Encrypted:"); 
     for(int i=0; i<strlen(text);i++) 
     { 
      printf("%x ", (unsigned char) encrypted[i]); 
     } 
     printf("\n"); 
    } 
    else{printf("Encrypted:%s\n", encrypted);} //this is line 40 

事情是,它的工作如預期,但cppcheck一直纏着我,我應該修復它?這是否是錯誤的?

+0

如果你到了40行,'encrypted'肯定是空的,'的printf(「加密: %s \ n「,加密)'是未定義的行爲。 – aschepler

回答

2

只有當encrypted爲NULL時,纔會輸入代碼的else塊。所以你傳遞一個NULL指針到printf。這可以調用undefined behavior

既然你知道指針是在這一點上NULL,只是明確地打印爲NULL:

else{printf("Encrypted: (null)\n");} 
+0

我明白了,謝謝你,我有這個printf,所以我可以看看它是否返回null,但這應該工作! – Mathue24

+0

@ Mathue24很高興我能幫到你。如果您覺得它有用,請隨時[接受此答案](http://stackoverflow.com/help/accepted-answer)。 – dbush

+0

@ Mathue24:注意,如果你傳遞一個NULL字符串,glibc會讓你輸出'(null)',這不是標準規定的,gcc本身通常會重新調用'puts'調用'printf'調用,如果傳遞NULL,它會直接崩潰。如果您需要添加調試打印以查看該字符串是否不爲NULL,請按上圖所示進行操作。 –