2012-02-01 18 views
-4

以下のカバレッジエラーを修正します。ここでは2番目のパラメータサイズは sizeof(empID)-1またはsizeof(empID)を使用する必要がありますか?ヌル文字を削除するために1を引くべきですか? EX:C++でのCoverityの問題+ snprintfの使用

char empID[8] ;     
snprintf(empID,sizeof(empID)-1, "S%05d", (char)pManager -> GetEmpID(groupID, levelID)) ; 

コベリティ出力:

【非常に危険]危険な関数(SECURE_CODING)を呼び出します。 "sprintf"を使用すると、間違って実行されるとバッファオーバーフローが発生することがあります( )。 sprintf() は任意の長い文字列を仮定しているため、発信者は宛先の実際の領域をオーバーフローさせないように注意する必要があります。 代わりにsnprintf()を使用してください。 、または正確な精度指定子を修正してください。

+2

なぜ[マニュアルページ(http://linux.die.net/man/3/snprintf)を読んでいませんか?それは非常に明確です。 –

+0

Coverityレポートは、表示していないコード上にあります。あなたの質問にも適合していますか?「おそらく* is *である答えをsnprintf()にどうやって伝えるのですか?」 –

答えて

1

機能のsnprintf()とvsnprintf()STRに(終端NULLバイト( '\ 0')を含む)で最もサイズバイトを書き込みます。

http://linux.die.net/man/3/snprintf

だから、1を減算する必要、サイズがすでにヌルターミネータを含みません。

+0

INfoに感謝します。非常に役に立ちます。 – Sudhakar

+0

どこかで私は – Sudhakar

+0

@Sudhakar:あなたはおそらくstrncpy()のことを考えています – stefaanv

1

あなたは、私がここにこの

void main(){ 
    char ch_1[5]; 
    strcpy(ch_1, "1234"); 
    snprintf(ch_1, sizeof(ch_1), "abcdefg"); 
    printf("ch_1=%s\n", ch_1); 
} 

sizeof(ch_1)戻り5で単にテスト1を減算する必要はないと思います。 snprintfは自動的に1を減算します。つまり、これをコピー5-1=4文字と解釈し、5番目の位置にヌルターミネーターを入れます。

結果がCH_1ある= ABCD

関連する問題