4

以下のコードを使用しています。

char filename[ 255 ];
strncpy( filename, getenv( "HOME" ), 235 );
strncat( filename, "/.config/stationlist.xml", 255 );

次のメッセージを取得します。

(warning) Dangerous usage of strncat - 3rd parameter is the maximum number of characters to append.
(error) Dangerous usage of 'filename' (strncpy doesn't always null-terminate it).
4

6 に答える 6

7

私は通常、 と の使用を避けstr*cpy()ますstr*cat()。境界条件、不可解な API 定義、および意図しないパフォーマンスへの影響に対処する必要があります。

代わりに使用できますsnprintf()。宛先バッファのサイズと競合する必要があるだけです。また、オーバーフローしないという点でより安全であり、常に NUL で終了します。

char filename[255];
const char *home = getenv("HOME");
if (home == 0) home = ".";
int r = snprintf(filename, sizeof(filename), "%s%s", home, "/.config/stationlist.xml");
if (r >= sizeof(filename)) {
    /* need a bigger filename buffer... */
} else if (r < 0) {
    /* handle error... */
}
于 2013-06-13T20:21:32.937 に答える
5

通話でオーバーフローする可能性がfilenameありますstrncat

使用する:

strncat(filename, "/.config/stationlist.xml",
        sizeof filename - strlen(filename) - 1);

strncpyまた、呼び出し後に必ずバッファーを null で終了してください。

strncpy( filename, getenv( "HOME" ), 235 );
filename[235] = '\0';

strncpyソースの長さがコピーする最大文字数以上の場合、asは宛先バッファーを null で終了しません。

于 2013-06-13T20:14:31.013 に答える
3

man strncpyこれは言うべきです:

Warning: If there is no null byte among the first n bytes
of src, the string placed in dest will not be null terminated.

最大長に達する前にソースで 0 バイトに遭遇すると、コピーされます。ただし、ソースの最初の 0 より前に最大長に達した場合、宛先は終了しません。strncpy()返品後、ご本人であることを確認するのが最善です...

于 2013-06-13T20:19:15.010 に答える
1

1) strncpy は必ずしもファイル名を null で終了するとは限りません。実際、getenv("HOME") が 235 文字より長く、getenv("HOME")[234] が 0 でない場合、そうはなりません。2) strncat() は、ファイル名を 255 文字を超えて拡張しようとする場合があります。

3rd parameter is the maximum number of characters to append. 

(dst の許容される合計の長さではありません)

于 2013-06-13T20:20:31.267 に答える