(Translated by https://www.hiragana.jp/)
strlcpy - Wikipedia

strlcpyC言語げんご文字もじれつ安全あんぜんにコピーするための関数かんすうである。ISO/IEC規定きていされた標準ひょうじゅんCライブラリ関数かんすうではないが、BSD libc などにふくまれている。危険きけん使つかかたをしてしまいがちな関数かんすうstrcpystrncpy代替だいたいとして、Todd C. MillerおよびTheo de Raadt (テオ・デ・ラート) が開発かいはつした[1]

概要がいよう

編集へんしゅう

関数かんすうプロトタイプ宣言せんげん)は以下いかである。

size_t strlcpy(char *dst, const char *src, size_t size);

ポインタsrcすアドレスから最大さいだいsize - 1バイトの文字もじれつdstにコピーし、dst文字もじれつかならNUL文字もじ[注釈ちゅうしゃく 1]わるようにする。つまり、dstのバッファの実際じっさいおおきさをsize指定していすれば[注釈ちゅうしゃく 2]バッファオーバーランしないことが保証ほしょうされる。

strncpyたプロトタイプchar *strncpy(char *dest, const char *src, size_t count)[2]つが、最大さいだいcountバイトをコピーするためNUL文字もじわるとはかぎらないてんや、文字もじれつみじか場合ばあいdstのこった部分ぶぶんをすべてゼロでめるてんstrlcpyことなる。

実装じっそうじょうきょう

編集へんしゅう

ToddとTheoはOpenBSD開発かいはつしゃであり、strlcpy最初さいしょ実装じっそうしたオペレーティングシステム (OS) はOpenBSD 2.4である。以後いごFreeBSD 3.3をふくめ、SolarismacOSひとしかくOS、OpenSSLひとしのライブラリにも採用さいようされている。Linuxではlibbsdライブラリ経由けいゆ利用りようできる。

一方いっぽうで、GNU Cライブラリ (glibc) の開発かいはつしゃたちは、GNU Coding Standardsきんじられている「ながくだりだまってめる」関数かんすうである、このような仕様しよう関数かんすうはバグである、いい加減かげんなプログラムを助長じょちょうしてしまう、あらたなセキュリティ問題もんだいむ、など否定ひていてき見解けんかいしめしており[3]標準ひょうじゅん規格きかくふくまれないかぎりはglibcには実装じっそうしない意向いこうであった。しかし、POSIX仕様しようでの標準ひょうじゅんけて2.38で実装じっそうされた。

Microsoft Visual C++には実装じっそうされていないが、バージョン8.0 (2005) 以降いこうはセキュリティ強化きょうかバージョンのCRT関数かんすうとして、出力しゅつりょくバッファサイズをりパラメータ検証けんしょう実行じっこうするstrcpy_s実装じっそうされている[4][注釈ちゅうしゃく 3]strcpy_sC11規格きかく実装じっそう任意にんいのセキュリティ強化きょうか関数かんすうとして標準ひょうじゅんされている[5]

危険きけん利用りようれい

編集へんしゅう

安易あんいstrlcpy利用りようが、かえって危険きけん結果けっかをもたらすれい以下いかしめす。

char cmd[] = "rm *.bak";
char buf[5];
strlcpy(buf, cmd, sizeof(buf));
system(buf);

sizeof(buf)5であるため、最初さいしょ5 - 1すなわち4文字もじしかコピーされず、システムコール"rm *"(カレントディレクトリないぜんファイルの削除さくじょ)が実行じっこうされることになる。

本来ほんらいstrlcpyもどをチェックするなどして、文字もじれつがすべて意図いとしたとおりにコピーされたかどうかを確認かくにんすべきである。

関連かんれん項目こうもく

編集へんしゅう

脚注きゃくちゅう

編集へんしゅう

注釈ちゅうしゃく

編集へんしゅう
  1. ^ NULLポインタ区別くべつするため、意図いとてきASCII略称りゃくしょうNULを使つかっている。
  2. ^ たとえば引数ひきすうdst固定こていちょう配列はいれつ変数へんすうchar buf[N]わた場合ばあいNまたはsizeof(buf)引数ひきすうsize指定していすればよい。
  3. ^ C++場合ばあいはテンプレートかた引数ひきすうとして固定こていちょう配列はいれつ要素ようそすう関数かんすうオーバーロードが利用りようでき、また通常つうじょうはコンパイラの推論すいろんによって自動的じどうてき決定けっていされるため、固定こていちょう配列はいれつ場合ばあい要素ようそすう明示めいじてきわた必要ひつようがなく、また要素ようそすう指定していミスをふせぐことができる。これはとくwcscpy_sのようなwchar_t配列はいれつ関数かんすう使用しようする場合ばあい有用ゆうようである。

出典しゅってん

編集へんしゅう

外部がいぶリンク

編集へんしゅう