注目★★★★★Lobsters
C言語のヌル終端文字列は設計ミス、長さベース設計が正解
30秒で把握
- 1C言語のヌル終端文字列は1970年代の設計・現代では長さベース構造体が標準
- 2ヌル終端では長さ情報が失われ、strlen()の繰り返し呼び出しでバグと非効率が多発
- 3snprintf()など標準関数の仕様が「長さ」定義で矛盾・開発者が常に混乱を招いている
要約
C言語がヌル終端文字列を採用したのは1970年代の制約下では妥当だったが、現代には不要な設計ミスだと著者は論じる。ポインタと長さを保持する構造体ベースの設計が、ほぼすべての現代言語で採用されている理由は複数ある。まず、長さを保存していないため、strlen()の繰り返し呼び出しやバイト単位の反復に頼らざるを得ず、非効率で버그の温床になる。次に、snprintf()など標準ライブラリ関数が「長さ」の定義を一貫させておらず、引数と戻り値で異なる意味を持つため、開発者は常に迷う。
あなたへの影響
C言語を使い続けるレガシーシステムやOSカーネル開発では避けられない制約だが、新規プロジェクトやRust・Go など現代言語選択時の根拠として参考になる。
推奨:自社の C コード資産でセキュリティ監査を進める際は、文字列長の扱いが曖昧な箇所でのバッファ脆弱性リスクを重視すべき。