このs
場合、 は「安全」の略ではなく、「セキュリティ強化」の略です。の場合fopen_s
、ファイルを開く前にパラメータの有効性がチェックされます。
を使用fopen
すると、ファイル名に NULL ポインターを渡すことができ、すべてがバラバラになる可能性が高くなります。fopen_s
その問題はありません(a)。
これらの境界チェック インターフェースfopen_s
は ISO 標準のオプション部分であり、付属書 K で詳述されていることに注意してください (とにかく C11 のように)。実装はそれらを提供する必要はなく、正直に言うとfopen
、および他の多くのいわゆる安全でない関数は、コーダーとして何をしているかを知っていれば完全に安全です。
fopen_s
NULL ポインターはトラップしますが、無効なポインターはトラップしないため、安全ではなくセキュリティが強化されていることに注意してください。
デスティネーションバッファサイズを提供することを強制する他の「安全な」関数も、適切なサイズを渡す限り安全です。大きすぎるものを渡すと、すべての賭けが無効になります。
(a)からC11 K.3.5.2.1 The fopen_s function
:
errno_t fopen_s (
FILE * restrict * restrict streamptr,
const char * restrict filename,
const char * restrict mode);
ランタイム制約
streamptr、filename、または mode のいずれもヌル ポインターであってはなりません。
ランタイム制約違反がある場合、fopen_s はファイルを開こうとしません。さらに、streamptr がヌル ポインターでない場合、fopen_s は *streamptr をヌル ポインターに設定します。
ファイル名とモードの両方が文字列を指している必要があるが、NULL ポインターを指定した場合に何が起こるかを指定しないというのと対照的ですC11 7.20.5.3 The fopen function
(ほとんどの実装は、NULL ポインターの逆参照でクラッシュする可能性があります)。