strlcat
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/09/09 16:17 UTC 版)
strlcat はC言語で文字列を安全に結合するための関数である。ISO/IEC で規定された標準Cライブラリの関数ではないが、BSD libc などに含まれている。危険な使い方をしてしまいがちな関数strcatやstrncatの代替として、Todd C. MillerおよびTheo de Raadt (テオ・デ・ラート) が開発した[1]。
概要
関数プロトタイプ(宣言)は以下である。
size_t strlcat(char *dst, const char *src, size_t size);
ポインタsrc
の指すアドレスから最大でsize - strlen(dst) - 1
バイトだけ文字列をdst
の末尾に追記し、NUL文字[注釈 1]で終わるようにする。つまり、dst
のバッファの実際の大きさをsize
に指定すれば、バッファオーバーランしないことが保証される。
strncat
は似たプロトタイプchar *strncat(char *dest, const char *src, size_t count)
[2]を持つが、第3引数count
の意味はsrc
から最大で何バイトコピーするかであり、NUL文字を考慮すると最大でcount + 1
バイトがコピーされる。またcount
の値は、dest
に既に存在する文字数も考慮しなくてはいけない。この複雑さからしばしばcount
の指定を誤り、バッファオーバーランの原因となる。
実装状況
ToddとTheoはOpenBSDの開発者であり、strlcat
を最初に実装したオペレーティングシステム (OS) はOpenBSD 2.4である。以後、FreeBSD 3.3を含め、SolarisやmacOSにも採用されている。Linuxではlibbsdライブラリ経由で利用できる。POSIX仕様での標準化を受けてglibcでは2.38で実装された。
Microsoft Visual C++には実装されていないが、バージョン8.0 (2005) 以降はセキュリティ強化バージョンのCRT関数として、出力バッファサイズを受け取りパラメータ検証を実行するstrcat_s
が実装されている[3]。strcat_s
はC11規格で実装任意のセキュリティ強化関数として標準化されている[4]。
関連項目
脚注
注釈
出典
外部リンク
strlcat(3)
– FreeBSD Library Functions Manual Pages (en)
- Strlcatのページへのリンク