STRCAT(3) | FreeBSD Library Functions Manual | STRCAT(3) |
名称
strcat, strncat — 文字列を連結するライブラリ
Standard C Library (libc, -lc)書式
#include < string.h> char *
strcat( char * restrict s, const char * restrict append);
char *
strncat( char * restrict s, const char * restrict append, size_t count);
解説
strcat() と strncat() 関数は、ヌル文字で終了する文字列 s の終りに、ヌル文字で終了する文字列 append のコピーを追加し、次に終端の‘\0
’を追加します。文字列
s は、結果を保持するための十分な空間がなければなりません。
strncat() 関数は、 append から最高で count 文字まで追加し、次に終端の‘ \0
’を追加します。
戻り値
strcat() と strncat() 関数は、ポインタ s を返します。規格
strcat() と strncat() 関数は、 ISO/IEC 9899:1990 (“ISO C90”) に適合しています。セキュリティの考察
strcat() 関数は、悪意があるユーザがバッファオーバフロー攻撃で実行プログラムの機能を独断的に変更することを可能にするやり方で容易に悪用されます。 (FSA を参照。)strcat() を使用することは避けてください。代わりに、 strncat() または strlcat() を使用して、それが保持することができるより、多くの文字が宛先のバッファにコピーされないことを確実にします。
strncat() も問題になるかもしれないことに注意してください。まったく切り詰められない文字列に対してセキュリティ上の問題となるかもしれません。切り詰められた文字列は、オリジナルである限り長くならないので、それは、完全に異なるリソースを参照し、切り詰められたリソースの使用法は、極めて不正確な振る舞いの結果となるかもしれません。例:
void foo(const char *arbitrary_string) { char onstack[8]; #if defined(BAD) /* * この最初の strcat は, ひどい振る舞いです. strcat を * 使用しないでください! */ (void)strcat(onstack, arbitrary_string); /* BAD! */ #elif defined(BETTER) /* * 次の 2 行は, strncat() の良い使用を示しています. */ (void)strncat(onstack, arbitrary_string, sizeof(onstack) - strlen(onstack) - 1); #elif defined(BEST) /* * これらの行は, 切り詰めのためにテストすることによりさらに着実です. */ if (strlen(arbitrary_string) + 1 > sizeof(onstack) - strlen(onstack)) err(1, "onstack would be truncated"); (void)strncat(onstack, arbitrary_string, sizeof(onstack) - strlen(onstack) - 1); #endif }
December 1, 2009 | FreeBSD |