Handling of strings in the C programming language
C言語の標準ライブラリには、文字列(文字列とバイト文字列)に対する操作を実装する関数群が用意されています。コピー、連結、トークン化、検索など、様々な操作がサポートされています。文字列の場合、標準ライブラリは文字列をヌル終端する規則を採用しています。つまり、 n文字の文字列はn + 1個の要素からなる配列として表現され、最後の要素は数値0を持つ
「ヌル文字」となります。
プログラミング言語自体における文字列の唯一のサポートは、コンパイラが引用符で囲まれた文字列定数をnull で終わる文字列に変換することです。
定義
文字列は、最初のゼロコード単位(NULコード単位と呼ばれることが多い)で終了する連続したコード単位の列として定義されます。 [1]これは、最初のゼロコード単位が文字列の終わりを示すため、文字列にゼロコード単位を含めることができないことを意味します。文字列の長さは、ゼロコード単位の前のコード単位の数です。[1]文字列が占有するメモリは、ゼロ終端文字を格納するためのスペースが必要であるため、常に長さよりも1コード単位多くなります。
一般的に、「文字列」という用語は、コード単位が 型の文字列を指しますchar。これは、すべての現代のマシンでは正確に8ビットです。C90では、型のコード単位を使用するワイド文字列[1]が定義されていますwchar_t。これは現代のマシンでは16ビットまたは32ビットです。これはUnicodeを対象としていましたが、Unicodeの通常の文字列ではUTF-8を使用するのがますます一般的になっています。
文字列は、最初のコードユニットへのポインタを渡すことで関数に渡されます。char*と はwchar_t*異なる型であるため、ワイド文字列を処理する関数は通常の文字列を処理する関数とは異なり、異なる名前を持ちます。
文字列リテラル("text"Cソースコード内)は、コンパイル時に配列(char[]Cまたはconst char[]C++)に変換されます。[2]結果は、すべての文字と末尾のゼロコード単位を含むコード単位の配列です。C90ではL"text"ワイド文字列が生成されます。文字列リテラルにはゼロコード単位を含めることができます(1つの方法はソースコード内に格納することです\0)が、その場合、文字列はその時点で終了してしまいます。リテラルの残りの部分はメモリに配置されます(末尾に別のゼロコード単位が追加されます)。しかし、これらのコード単位が文字列リテラルから変換されたかどうかを知ることは不可能であるため、そのようなソースコードは文字列リテラルではありません。[3]
文字エンコーディング
char各文字列は、適切な種類のゼロ コード単位 (または)の最初の出現で終了しますwchar_t。したがって、バイト文字列 ( char*)には、 ASCIIまたは任意のASCII 拡張の非NUL文字を含めることができますが、 UTF-16などのエンコードの文字を含めることはできません(16 ビット コード単位がゼロでなくても、上位バイトまたは下位バイトがゼロになることがあります)。ワイド文字列に格納できるエンコードは の幅によって定義されます。ほとんどの実装では、は少なくとも 16 ビットであるため、UCS-2などのすべての 16 ビットエンコードを格納できます。 が32 ビットの場合、UTF-32などの 32 ビットエンコードを格納できます。(標準では「任意のワイド文字を保持できる型」が必要ですが、Windows では UCS-2 から UTF-16 への移行以降は当てはまりません。これは標準の欠陥として認識され、C++ で修正されました。) [ 4 ] C++11とC11 [5]wchar_twchar_twchar_tchar16_tchar32_t
可変幅エンコーディングは、バイト文字列とワイド文字列の両方で使用できます。文字列の長さとオフセットはwchar_t「文字数」ではなくバイト数またはバイト単位で測定されるため、初心者プログラマーにとっては混乱を招く可能性があります。C言語のバイト文字列ではUTF-8とShift JISがよく使用され、C言語のワイド文字列(16ビットの場合)ではUTF-16がよく使用されますwchar_t。 などの関数を使用して可変幅文字を含む文字列を切り捨てると、strncpy文字列の末尾に無効なシーケンスが生成されることがあります。切り捨てられた部分が、入力が有効であると想定するコードによって解釈される場合、これは安全ではない可能性があります。
(UTF-8) や(UTF-16 または UTF-32、 に依存)などの Unicode リテラルのサポートは実装定義であり、 [6]ソースコードが同じエンコーディングであることが要求される場合があります。特にコンパイラが引用符で囲まれた内容をコピーしてしまうような場合にはそうです。コンパイラやエディタによっては、UTF-8 の各バイトやUTF-16 の各ワードごとに、すべての非 ASCII 文字をシーケンスとして入力する必要があります。C11 (および C++11) 以降では、 のように、バイト文字列リテラルに対して UTF-8 を保証する新しいリテラル プレフィックスが利用できます。[7] C++20およびC23以降では、UTF-8 文字を格納するための型が追加され、u8 プレフィックス付きの文字リテラルと文字列リテラルの型はそれぞれ と に変更されました。
char foo[512] = "φωωβαρ";wchar_t foo[512] = L"φωωβαρ";wchar_tchar\xNN\uNNNNu8char foo[512] = u8"φωωβαρ";char8_tchar8_tchar8_t[]
特徴
用語
歴史的文書では、C 文字列の「バイト」ではなく「文字」という用語がしばしば使用されていたため、多くの人(誰?)は、これらの関数がUTF-8では動作しないと思い込んでいます。実際には、すべての長さはバイト単位で定義されており、これはすべての実装に当てはまります。また、これらの関数は UTF-8 でもシングルバイトエンコーディングと同様に動作します。BSD の文書はこの点を明確にするように修正されましたが、POSIX、Linux、および Windows の文書では、多くの箇所で「バイト」または「wchar_t」が正しい用語であるにもかかわらず、依然として「文字」が使用されています。
メモリバッファを処理する関数は、データの一部としてヌルバイトを含むバイトシーケンスを処理できます。これらの関数の名前は通常、接頭辞memの反対である ,で始まりますstr。
Cの文字列を操作する関数のほとんどはstring.hヘッダー(cstringC++の場合)で宣言されていますが、Cのワイド文字列を操作する関数はwchar.hヘッダー(cwcharC++の場合)で宣言されています。これらのヘッダーには、メモリバッファの処理に使用される関数の宣言も含まれているため、この名前はやや不適切です。
で宣言された関数は、 C標準ライブラリstring.hの一部として、Cをサポートするあらゆるプラットフォームで動作することが保証されているため、非常に人気があります。しかし、これらの関数には、注意深く適切に使用しないとバッファオーバーフローが発生する可能性があるなど、セキュリティ上の問題がいくつか存在します。そのため、プログラマーはより安全で、移植性が低い可能性のある関数を好みます。以下に、その中で人気のある関数をいくつか挙げます。これらの関数の中には、文字列ポインタを受け入れ、文字列内で非ポインタを返すことで、 constの正確性に違反するものもあります。これを修正するために、 C++版の標準ライブラリでは、
いくつかの関数が2つのオーバーロード関数に分割されています。constconst
定数と型
機能
マルチバイト関数
これらの機能はすべてmbstate_tオブジェクトは元々は静的メモリに格納されていたため(関数はスレッドセーフではなかった)、後に追加された関数では呼び出し側が管理する必要があった。これは元々、関数のシフト状態を追跡することを目的としていた。mbUTF-8などの最近のエンコーディングでは、この関数は必要ありません。しかし、これらの関数は、トイレエンコードは可変幅エンコードではないため、正確に1つのエンコードを処理するように設計されています。wchar_t一度に1つずつ、文字列ポインタではなく値渡しで渡します。UTF-16は可変幅エンコードなので、mbstate_tワイドエンコーディングのサロゲートペアを追跡するために再利用されているが、呼び出し側は依然として検出して呼び出す必要がある。mbtowc1文字につき2回です。[80] [81] [82]標準のその後の追加では、プログラマが関心を持つ唯一の変換はUTF-8とUTF-16の間であることが認められ、直接これが提供されています。
数値変換
C標準ライブラリには、数値変換のための関数がいくつか含まれています。バイト文字列を扱う関数はstdlib.hヘッダー(cstdlibC++では header )で定義されています。ワイド文字列を扱う関数はwchar.hヘッダー(cwcharC++では header )で定義されています。
関数strchr、、、、、、およびそれらのワイド対応関数はbsearch、文字列ポインタを受け取り、文字列内で非ポインタを返すためstrpbrk、const 正しくありません。これはC23で修正されました。[95]strrchrstrstrmemchrconstconst
また、規範修正第1版(C95)以降、atoxx関数は関数に包含されると考えられておりstrtoxxx、そのためC95もそれ以降の標準もこれらの関数のワイド文字版を提供していない。これに対する反論は、atoxxエラーとを区別していないというものである0。[96]
人気の拡張機能
strlcpy、strlcat
[22]と[18]をバッファオーバーフローを許さない関数に置き換える必要性は十分に認識されているにもかかわらず、標準化された関数は未だ確立されていません。これは、多くのCプログラマが、とが望ましい動作をするだろうと誤解していることが一因です。しかし、どちらの関数もそのような動作を想定して設計されたものではありません(これらは、ヌルパディングされた固定サイズの文字列バッファ(現代のソフトウェアではあまり使用されていないデータ形式)を操作することを目的としていました)。また、その動作と引数は直感的ではなく、熟練したプログラマでさえも誤って記述してしまうことがよくあります。[108]strcatstrcpystrncatstrncpy
最も人気のある[a]の代替はstrlcat[111]とstrlcpy[112]の関数で、1998 年 12 月にOpenBSD 2.4 で登場しました。 [108]これらの関数は常に 1 つの NUL を宛先バッファに書き込み、必要に応じて結果を切り捨て、必要なバッファのサイズを返します。これにより、切り捨てを検出し、切り捨てられない新しいバッファを作成するためのサイズが提供されます。長い間、これらの関数は(Linux 上のソフトウェアで使用されている) GNU C ライブラリには含まれていませんでした。その理由は、効率が悪いという理由、[113] C 文字列 (より優れた代替形式の文字列の代わりに) の使用を推奨する、[114] [115]その他の潜在的なエラーを隠蔽する可能性があるためです。[116] [117] glibcがサポートを追加していなかった間も、strlcatとstrlcpyはOpenBSD、FreeBSD、NetBSD、Solaris、OS X、QNXなどの多くのCライブラリ、および2008年に導入されたlibbsd [118]や2011年に導入されたmusl [119] [120]などのLinux用の代替Cライブラリに実装されており、ソースコードはSDL、GLib、ffmpeg、rsyncなどの他のプロジェクトに直接追加され、 Linuxカーネル内部にも追加されました。これは2024年に変更されましたが、glibcのFAQではglibc 2.38の時点でコードがコミットされ[121]追加されたと述べています。[122]これらの関数はPOSIX.1-2024の一部として標準化されました。[123] Austin Group Defect Tracker ID 986は、POSIXのそのような計画に関するいくつかの議論を追跡しました。
マイクロソフトは2004年のセキュリティ開発ライフサイクルの一環として、strcpy_sおよびstrcat_s(その他多数の関数とともに)を含む「セキュア」関数群を導入しました。 [124]これらの関数は、ISO/IEC WDTR 24731で提案されたオプションのC11(附属書K)の一部として、若干の変更を加えて標準化されました。 [125]これらの関数は、文字列がバッファに収まらないほど長すぎないかどうかなど、様々なチェックを行います。チェックに失敗した場合、ユーザーが指定した「ランタイム制約ハンドラ」関数が呼び出され、[126]通常はプログラムを中止します。[127] [128]これらの関数は、当初Windowsのみに実装されていたこと、そしてMicrosoft Visual C++で標準関数ではなくこれらの関数の使用を推奨する警告メッセージが表示されるようになったことから、かなりの批判を浴びました。これは、マイクロソフトが開発者を自社プラットフォームに閉じ込めようとする試みではないかと推測する声もあります。[129]これらの関数の使用経験から、その採用と使用上の誤りに重大な問題があることが示されたため、C標準の次期改訂版では附属書Kを削除することが提案されました。[130]コンパイラによる不要な最適化を回避する方法としての使用がmemset_s提案されています。[131] [132]
参照
注記
- ^ GitHubでは、 の使用回数は7,813,206回であるの
strlcpyに対し、 の使用回数は38,644回strcpy_s( の使用回数は15,286,150回strcpy)です。 [要出典]
参考文献
- ^ abc 「C99標準ドラフト+TC3」(PDF) §7.1.1p1 。 2011年1月7日閲覧。
{{cite web}}: CS1 maint: location (link)
- ^ 「C99標準ドラフト + TC3」(PDF) §6.4.5p7 。 2011年1月7日閲覧。
{{cite web}}: CS1 maint: location (link)
- ^ 「C99標準ドラフト + TC3」(PDF) . 6.4.5節脚注66. 2011年1月7日閲覧。
{{cite web}}: CS1 maint: location (link)
- ^ 「既存の慣行に合わせて wchar_t の要件を緩和する」(PDF)。
- ^ 「基本型」. en.cppreference.com .
- ^ 「C99標準草案 + TC3」(PDF) §5.1.1.2翻訳フェーズ、p1 。 2011年12月23日閲覧。
{{cite web}}: CS1 maint: location (link)
- ^ "文字列リテラル". en.cppreference.com . 2019年12月23日閲覧。
- ^ "stddef.h - 標準型定義". The Open Group . 2017年1月28日閲覧。
- ^ リチャード・ギラム(2003年)『Unicode Demystified: A Practical Programmer's Guide to the Encoding Standard』Addison-Wesley Professional. p. 714. ISBN 9780201700527。
- ^ 「C++ - 一般的なプログラミングにおけるwchar_tの用途は何ですか?」Stack Overflow 。 2022年8月1日閲覧。
- ^ “char, wchar_t, char8_t, char16_t, char32_t”. docs.microsoft.com . 2022年8月1日閲覧。
- ^ "char8_t"。
- ^ ab "<cuchar> (uchar.h)"。
- ^ "char16_t".
- ^ ab 「テキストマクロの置き換え」。
- ^ ab 「基本型」.
- ^ "char32_t"。
- ^ ab "strcpy - cppreference.com". En.cppreference.com. 2014年1月2日. 2014年3月6日閲覧。
- ^ "wcscpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strncpy - cppreference.com". En.cppreference.com. 2013年10月4日. 2014年3月6日閲覧。
- ^ "wcsncpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ ab "strcat - cppreference.com". En.cppreference.com. 2013年10月8日. 2014年3月6日閲覧。
- ^ "wcscat - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strncat - cppreference.com". En.cppreference.com. 2013年7月1日. 2014年3月6日閲覧。
- ^ "wcsncat - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strxfrm - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcsxfrm - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strlen - cppreference.com". En.cppreference.com. 2013年12月27日. 2014年3月6日閲覧。
- ^ "wcslen - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strcmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcscmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strncmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcsncmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strcoll - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcscoll - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strchr - cppreference.com". En.cppreference.com. 2014年2月23日. 2014年3月6日閲覧。
- ^ "wcschr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strrchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcsrchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strspn - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcsspn - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strcspn - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧。
- ^ "wcscspn - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strpbrk - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧。
- ^ "wcspbrk - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strstr - cppreference.com". En.cppreference.com. 2013年10月16日. 2014年3月6日閲覧。
- ^ "wcsstr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strtok - cppreference.com". En.cppreference.com. 2013年9月3日. 2014年3月6日閲覧。
- ^ "wcstok - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strerror - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧。
- ^ "memset - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wmemset - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "memcpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wmemcpy - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "memmove - cppreference.com". En.cppreference.com. 2014年1月25日. 2014年3月6日閲覧。
- ^ "wmemmove - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "memcmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wmemcmp - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "memchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wmemchr - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mblen - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mbtowc - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wctomb - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧。
- ^ "mbstowcs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcstombs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "btowc - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wctob - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mbsinit - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mbrlen - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mbrtowc - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcrtomb - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mbsrtowcs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcsrtombs - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "mbrtoc8 - cppreference.com". En.cppreference.com。
- ^ "c8rtomb - cppreference.com". En.cppreference.com.
- ^ "mbrtoc16 - cppreference.com". En.cppreference.com.
- ^ "c16rtomb - cppreference.com". En.cppreference.com。
- ^ "mbrtoc32 - cppreference.com". En.cppreference.com.
- ^ "c23rtomb - cppreference.com". En.cppreference.com。
- ^ “6.3.2 変換状態の表現”. GNU Cライブラリ. 2017年1月31日閲覧。
- ^ "root/src/multibyte/c16rtomb.c" . 2017年1月31日閲覧。
- ^ "/stable/11/lib/libc/locale/c16rtomb.c の内容" . 2017年1月31日閲覧。
- ^ "atof - cppreference.com". En.cppreference.com. 2013年5月31日. 2014年3月6日閲覧。
- ^ "アトイ、環礁、環礁 - cppreference.com". En.cppreference.com。 2014 年 1 月 18 日。2014 年3 月 6 日に取得。
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧。
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧。
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧。
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧。
- ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 2014年2月4日. 2014年3月6日閲覧。
- ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com . 2014年3月6日閲覧。
- ^ 「WG14-N3020 : 修飾子を保持する標準ライブラリ関数、v4」(PDF) . open-std.org . 2022年6月13日.
- ^ C99 根拠、7.20.1.1
- ^ "bzero". The Open Group . 2017年11月27日閲覧。
- ^ "bzero(3)". OpenBSD . 2017年11月27日閲覧。
- ^ "memccpy". Pubs.opengroup.org . 2014年3月6日閲覧。
- ^ "mempcpy(3) - Linuxマニュアルページ". Kernel.org . 2014年3月6日閲覧。
- ^ "strcasecmp(3) - Linuxマニュアルページ". Kernel.org . 2014年3月6日閲覧。
- ^ "strcat_s, wcscat_s, _mbscat_s". docs.microsoft.com . 2022年4月22日閲覧。
- ^ “strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l”. docs.microsoft.com . 2022年4月22日閲覧。
- ^ "strdup". Pubs.opengroup.org . 2014年3月6日閲覧。
- ^ "strerror(3) - Linuxマニュアルページ". man7.org . 2019年11月3日閲覧。
- ^ "String | stricmp()". C Programming Expert.com . 2014年3月6日閲覧。
- ^ ab "strlcpy, strlcat — サイズ制限のある文字列のコピーと連結". OpenBSD . 2016年5月26日閲覧。
- ^ abcd Todd C. Miller; Theo de Raadt (1999). 「strlcpy と strlcat – 一貫性があり安全な文字列のコピーと連結」USENIX '99.
- ^ "strsignal". Pubs.opengroup.org . 2014年3月6日閲覧。
- ^ 「ストラトーク」。 Pubs.opengroup.org 。2014 年3 月 6 日に取得。
- ^ Todd C. Miller. "strlcpy.c". BSD相互参照.
- ^ Todd C. Miller. "strlcat.c". BSD相互参照.
- ^ Miller, Damien (2005年10月). 「セキュアな移植性」(PDF) . 2016年6月26日閲覧.
この[strlcpyとstrlcat] APIは、ほとんどの最新のオペレーティングシステムと多くのスタンドアロンソフトウェアパッケージに採用されています[...]。注目すべき例外はGNU標準Cライブラリであるglibcです。glibcのメンテナは、これらの改良されたAPIが、ほとんどの場合、置き換えるAPIよりも高速であるという事前の証拠があるにもかかわらず、これらのAPIを「ひどく非効率なBSDのガラクタ」と呼び、頑なに組み入れることを拒否しています。
- ^ libc-alpha メーリングリスト Archived 9 June 2007 at the Wayback Machine、2000年8月8日のスレッドから選択されたメッセージ: 53, 60, 61
- ^ strlcpy() の長所と短所; LWN.net
- ^ 「glibcにstrlcpy()を追加する」lwn.net。
正しい文字列処理とは、文字列の長さを常に把握し、strcpyの代わりにmemcpyを使用できることを意味します。
- ^
strlcpy(3) – Linuxライブラリ関数マニュアル(ManKier.comより)「しかし、このような最適化はstrlcpy()とstrlcat()の本来の目的を損なわせるため、その妥当性には疑問が残るかもしれません。実際、このマニュアルページの最初のバージョンでは誤りがありました。」
- ^ "libbsd" . 2022年11月21日閲覧。
- ^ "root/src/string/strlcpy.c" . 2017年1月28日閲覧。
- ^ "root/src/string/strlcat.c" . 2017年1月28日閲覧。
- ^ strlc{py|at} コミット
- ^ Hacker News における glibc 2.38 の strlcpy と strlcat に関する議論
- ^ "strlcat". Pubs.opengroup.org . 2024年9月5日閲覧。
- ^ Lovell, Martyn. 「Visual Studio 2005の安全なCおよびC++ライブラリでコードへの攻撃を撃退」 . 2015年2月13日閲覧。
- ^ Safe Cライブラリ。「Safe Cライブラリは、ISO/IEC TR24731に準拠した境界チェックメモリおよび文字列関数を提供します。」Sourceforge 。 2013年3月6日閲覧。
- ^ 「C11標準草案」(PDF) §K.3.1.4p2 。 2013年2月13日閲覧。
{{cite web}}: CS1 maint: location (link)
- ^ 「C11標準草案」(PDF) §K.3.6.1.1p4 。 2013年2月13日閲覧。
{{cite web}}: CS1 maint: location (link)
- ^ 「パラメータ検証」。2022年10月21日。
- ^ ダニー・カレフ. 「彼らはまたやっている」. InformIT. 2012年1月15日時点のオリジナルよりアーカイブ。 2011年11月10日閲覧。
- ^ 「附属書Kの境界チェックインターフェースに関する現場経験」 。 2015年11月5日閲覧。
- ^ 「MSC06-C. コンパイラの最適化に注意」SEI CERT Cコーディング標準。
- ^
memset_s(3) – FreeBSDライブラリ関数マニュアル
外部リンク
ウィキブックCプログラミングには、Cプログラミング/文字列に関するページがあります。
- C 言語の高速 memcpy、さまざまな種類の CPU 命令アーキテクチャをターゲットとする複数の C コーディング例