2017-04-06 13 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'は間違いなくnullで、かつ' printfの(「暗号化: %s \ n "、encrypted)'は未定義の動作です。 – aschepler

答えて

2

コードのelseブロックは、encryptedがNULLの場合にのみ入力されます。したがって、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)'を出力します。標準では必須ではなく、 'puts'呼び出しに対する' printf'呼び出しをgcc自身が定期的に書き換えます。 NULLが渡されると、それはまっすぐにクラッシュします。文字列がNULLでないかどうかを確認するためにデバッグプリントを追加する必要がある場合は、上記のように明示的に行います。 –

関連する問題