
16.2
境界検査関数
279
ここに述べた条件のいくつかには「抜け穴」がある。名前空間で、あるいは静的リンケー
ジで識別子再利用ができるが、識別子の多重定義は混乱を招くので、標準ヘッダで宣言さ
れた識別子は完全に避けるのが一般には最も安全だ。以後の節では、C標準の将来の拡張
のために予約された識別子も挙げる。上に述べた箇条書きの最後の3規則はそのような予約
識別子にも当てはまる。
16.2
境界検査関数
C標準ライブラリの伝統的な関数の多くは、プログラマがポインタ引数で指定した文字
列を配列にコピーする。これらの関数には、配列が結果を格納する十分な大きさがあるか
どうかを検査する方法がない。プログラマだけが、配列の末端を越えてデータが書かれな
いことを保証する責任を負う。もしデータがあふれてしまうと、メモリの隣接オブジェクト
を変更しかねない。これはプログラムの信頼性と安全性への重大な脅威であり、クラッシュ
の危険がある。
この問題
を回避するために、C11標準附属書K「境界検査インタフェース」は、伝統的な
標準 C関数の代替として安全な新関数を導入した。これらの代替関数は、セキュア関数と
も呼ばれるが、転送先配列のサイズを指定する追加引数をとる。セキュア関数は、この情
報を用いて、生成した結果が配列境界を越えないことを保証する。セキュア関数の名前は、
例えば、
strcpy_s()
のように語尾が
_s
(「セキュア」の
s
)で終わる。従来の関数
strcpy()
と
異なり、
strcpy_s()
は指定された転送先配列が十