セキュア C ライブラリ
C ランタイム ライブラリ リファレンス への移動
セキュア C ライブラリが登場した最大の理由は、C ライブラリの文字列処理関数に範囲チェックが必要になったからです。 C ライブラリには、操作の結果を格納するのに十分な長さの文字列パラメータを呼び出し側が渡すものと想定している関数が多数あります。 長い方の文字列を短い方の文字列に上書きすると、実は、文字列の終端を越えてデータが書き込まれ、他のプログラム データが上書きされてしまいます。 その結果、"不可解な" 障害が発生するおそれがあります。何か失敗したのか、あるいはいつ失敗したのかを知る手段がプログラムにはないからです。
よくある解決策は "十分長い" 文字列を使用してみることでしたが、この方法は 2 つの問題につながるおそれがありました。 つまり、メモリ領域が無駄になることと、ユーザーの考える "十分な長さ" が実際には十分長くないことです。 さらに、有害なコードを実行させるためにバッファ オーバーフローが悪用され、オペレーティング システムやネットワークのセキュリティが低下するおそれもあります。
セキュア C ライブラリでは、多くの C ランタイム ライブラリ関数に対して、文字配列の範囲チェックに使用される特別なパラメータが導入されており、データは配列の終端を越えて書き込まれることは決してありません。 それに加えて、実行時制約と、ユーザーが独自の実行時違反処理関数を設定するための手段も導入されています。 それにより、プログラムは文字配列の操作で何か失敗した場合に、それがいつどこで起こったのかを知ることができ、誤りを修正したり、安全に停止することができます。
セキュア C ライブラリで促進されるプログラミング スタイルを実践すれば、より安全でバグの少ないコードを作成できるようになります。
目次
例:
int main(){
char corpName[10];
printf ("Enter your corporation name: ");
gets(name);
printf ("Your corporation name is: %s", corpName);
return 0;
}
クライアントが 9 文字より長い名前を入力すると、スタックとデータの破損が発生するおそれがあります。 gets(name); を gets_s(name,10) に変更すると、これらの問題はなくなります。ユーザーが何文字入力しようと、最初の 9 文字だけが文字配列 corpName に格納されるからです。
stdio.h
入出力ルーチン
ファイル アクセス関数
書式付き入出力関数
- fprintf_s、fwprintf_s
- fscanf_s、fwscanf_s
- printf_s、wprintf_s
- scanf_s、wscanf_s
- snprintf_s、snwprintf_s
- sprintf_s、swprintf_s
- sscanf_s、swscanf_s
- vfprintf_s、vfwprintf_s
- vfscanf_s、vfwscanf_s
- vprintf_s、vwprintf_s
- vscanf_s、vwscanf_s
- vsnprintf_s、vsnwprintf_s
- vsprintf_s、vswprintf_s
- vsscanf_s、vswscanf_s