FIO38-C. 入出力操作に FIlE オブジェクトのコピーを使用しない
ストリームの制御に使用する FILE オブジェクトのアドレスが重要な意味を持つ場合があり、FILE オブジェクトのコピーは、必ずしも元のオブジェクトの代りに使用できるとは限らない。したがって、いかなる入出力操作にも FIlE オブジェクトのコピーを使用してはならない。
違反コード
以下のコード例は fputs() の呼び出しに stdout のコピーを使用しているため失敗する可能性がある。
int main(void) { FILE my_stdout = *(stdout); if (fputs("Hello, World!\n", &my_stdout) == EOF) { /* エラー処理 */ } return 0; }
たとえば、上記のコードは、Microsoft Visual Studio 2005 でコンパイルされ Windows で実行されると「アクセス違反」が発生し、プログラムは終了する。
適合コード
以下の解決法では、FILE オブジェクトへのポインタのコピーを使って fputs() を呼び出している。
int main(void) { FILE *my_stdout = stdout; if (fputs("Hello, World!\n", my_stdout) == EOF) { /* エラー処理 */ } return 0; }
リスク評価
FILE オブジェクトのコピーを元のオブジェクトの代わりに使用するとクラッシュが発生し、サービス運用妨害 (DoS) 攻撃に利用される可能性がある。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
FIO38-C | 低 | 中 | 中 | P4 | L3 |
自動検出
Compass/ROSE はこのルールの単純な違反を検出することができる。
参考情報
- [ISO/IEC 9899-1999] Section 7.19.3, "Files"
翻訳元
これは以下のページを翻訳したものです。
FIO38-C. Do not use a copy of a FILE object for input and output