INT33-C. 除算および剰余演算がゼロ除算エラーを引き起こさないことを保証する
除算および剰余演算は、ゼロ除算エラーを引き起こす可能性がある。
Cでは、除算と剰余演算が未定義の動作を引き起こす2つの条件が指定されている。
UB | 説明 |
|
|
n/a | 商 a/b が表現不可能な場合、a/b と a%b の両方とも動作は未定義である(6.5.5)。 |
除算
/
演算子の結果は、第1オペランドを第2オペランドで除算した商である。除算演算は、ゼロ除算エラーを引き起こす可能性がある。また、被除数が符号付き整数型の最小値(負の数)に等しく除数が−1に等しい場合、2の補数による符号付き整数型の除算時にオーバーフローが発生する可能性がある。(「INT32-C. 符号付き整数演算がオーバーフローを引き起こさないことを保証する」を参照。)
違反コード
以下のコード例は、符号付きのオペランド sl1
と sl2
による除算時にゼロ除算エラーを引き起こす可能性がある。
signed long sl1, sl2, result; /* sl1 と sl2 を初期化 */ result = sl1 / sl2;
適合コード
以下の適合コードでは、問題の発生する可能性のある除算演算に対して、ゼロ除算エラーや符号付き整数オーバーフローが発生しないことを確認している。
signed long sl1, sl2, result; /* sl1 と sl2 を初期化 */ if ( (sl2 == 0) || ( (sl1 == LONG_MIN) && (sl2 == -1) ) ) { /* エラー処理 */ } else { result = sl1 / sl2; }
剰余演算
剰余演算は、2つの整数型オペランドによる除算を行った際の剰余を計算する。
違反コード
以下のコード例は、符号付きオペランド sl1
と sl2
の剰余演算時にゼロ除算エラーを引き起こす可能性がある。
signed long sl1, sl2, result; /* sl1 と sl2 を初期化 */ result = sl1 % sl2;
適合コード
以下の適合コードでは、問題の発生する可能性のある剰余演算に対して、ゼロ除算エラーやオーバーフローエラーが発生しないことを確認している。
signed long sl1, sl2, result; /* sl1 と sl2 を初期化 */ if ( (sl2 == 0) || ( (sl1 == LONG_MIN) && (sl2 == -1) ) ) { /* エラー処理 */ } else { result = sl1 % sl2; }
リスク評価
ゼロ除算を行うと、プログラムの異常終了やサービス運用妨害(DoS)につながる可能性がある。
ルール |
深刻度 |
可能性 |
修正コスト |
優先度 |
レベル |
---|---|---|---|---|---|
INT33-C |
低 |
高 |
中 |
P6 |
L2 |
自動検出(最新の情報はこちら)
ツール |
バージョン |
チェッカー |
説明 |
---|---|---|---|
Compass/ROSE |
このルールの違反を検出できる。特に、除算や剰余を含むすべての演算において、第2オペランドがゼロかどうかのチェックを事前に行っていることを確認する。 |
||
Coverity | 6.5 | DIVIDE_BY_ZERO | 実装済み |
Fortify SCA | 5.0 |
CERT C Rule Packを使ってこのルールの違反を検出できる。 |
|
LDRA tool suite |
V. 8.5.4 |
43 D |
部分的に実装済み |
PRQA QA-C | 8.1 |
2830 (C) |
実装済み |
関連するガイドライン
CERT C++ Secure Coding Standard | INT33-CPP. Ensure that division and modulo operations do not result in divide-by-zero errors |
Java セキュアコーディングスタンダード CERT/Oracle 版 | NUM02-J. 除算と剰余演算でゼロ除算エラーを起こさない |
ISO/IEC TS 17961 | Integer division errors [diverr] |
MITRE CWE | CWE-369, Divide by zero |
参考資料
[Seacord 2013b] | Chapter 5, "Integer Security" |
[Warren 2002] | Chapter 2, "Basics" |
翻訳元
これは以下のページを翻訳したものです。
INT33-C. Ensure that division and modulo operations do not result in divide-by-zero errors (revision 75)