Strlcat

strlcatC言語文字列を安全に結合するための関数である。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を含め、SolarismacOSにも採用されている。Linuxではlibbsdライブラリ経由で利用できる。POSIX仕様での標準化を受けてglibcでは2.38で実装された。

Microsoft Visual C++には実装されていないが、バージョン8.0 (2005) 以降はセキュリティ強化バージョンのCRT関数として、出力バッファサイズを受け取りパラメータ検証を実行するstrcat_sが実装されている[3]strcat_sはC11規格で実装任意のセキュリティ強化関数として標準化されている[4]

関連項目

脚注

注釈

  1. ^ NULLポインタと区別するため、意図的にASCIIの略称NULを使っている。

出典

  1. ^ strlcpy and strlcat - consistent, safe, string copy and concatenation. - 1999 USENIX Annual Technical Conference, June 6-11, 1999, Monterey, California, USA
  2. ^ strncat, strncat_s - cppreference.com
  3. ^ strcat_s, wcscat_s, _mbscat_s, _mbscat_s_l | Microsoft Learn
  4. ^ strcat, strcat_s - cppreference.com

外部リンク

  • K&R
  • ANSI C
    • C89
    • C90
  • C99
  • C11
  • C17(英語版)
  • C2x(英語版)
  • Embedded C(英語版)
  • MISRA C
Cの機能
  • 関数
  • ヘッダファイル
  • 演算子
  • 文字列(英語版)
  • 文法(英語版)
  • プリプロセッサ(英語版)
  • データ型(英語版)
  • キーワード
  • フリースタンディング環境
  • 標準Cライブラリの関数
    • ctype.h(英語版)
    • stdio.h
    • math.h(英語版)
    • stdlib.h(英語版)
    • string.h(英語版)
    • time.h
    • stdarg.h(英語版)
    • POSIXライブラリ(英語版)
    標準Cライブラリ
    コンパイラ
    統合開発環境
    派生言語
    関連項目
    • カテゴリ カテゴリ
    • 表示
    • 編集