NUM02-J. 除算と剰余演算でゼロ除算エラーを起こさない
整数に対する除算と剰余演算ではゼロ除算エラーが発生する可能性がある。そのため、整数に対する除算と剰余演算を行う前に、除数がゼロでないかをチェックする必要がある。浮動小数点数に対する除算と剰余演算は、このルールの対象ではない。
違反コード (除算)
除算演算子 / の結果は第1オペランドを第2オペランドで割った商となる。除算ではゼロ除算エラーが発生する可能性がある。また、2の補数表現の符号付き整数型の除算において、被除数が符号付き整数型の最小値 (負の値) で、除数が −1 の場合、オーバーフローが発生する (「NUM00-J. 整数オーバーフローを検出あるいは防止する」を参照)。以下の違反コード例では、符号付きオペランド num1 と num2 の除算時にゼロ除算エラーが発生する可能性がある。
long num1, num2, result;
/* num1 と num2 を初期化 */
result = num1 / num2;
適合コード (除算)
以下の適合コードでは、ゼロ除算エラーが発生しないよう、第2オペランドを検査している。
long num1, num2, result;
/* num1 と num2 を初期化 */
if (num2 == 0) {
// エラー処理
} else {
result = num1 / num2;
}
違反コード (剰余演算)
剰余演算子 % は、2つの整数型オペランドによる除算の剰余を計算する。以下の違反コード例では、符号付きオペランド num1 と num2 による剰余演算でゼロ除算エラーが発生する可能性がある。
long num1, num2, result;
/* num1 と num2 を初期化 */
result = num1 % num2;
適合コード (剰余演算)
以下の適合コードでは、ゼロ除算エラーが発生しないよう、第2オペランドを検査している。
long num1, num2, result;
/* num1 と num2 を初期化 */
if (num2 == 0) {
// エラー処理
} else {
result = num1 % num2;
}
リスク評価
ゼロ除算エラーはプログラムの異常終了やサービス運用妨害 (DoS) につながる可能性がある。
|
ルール |
深刻度 |
可能性 |
自動検出 |
自動修正 |
優先度 |
レベル |
|---|---|---|---|---|---|---|
|
NUM02-J |
低 |
高 |
不可 |
可 |
P6 |
L2 |
自動検出
| ツール | バージョン | チェッカー | 説明 |
|---|---|---|---|
| Coverity | 7.5 | DIVIDE_BY_ZERO | Implemented |
| Parasoft Jtest | 2024.2 | CERT.NUM02.ZERO | Avoid division by zero |
| PVS-Studio |
7.38 |
V6020 |
|
| SonarQube |
9.9 |
S3518 | Zero should not be a possible denominator |
関連ガイドライン
|
CWE-369, Divide by Zero |
参考文献
|
Subclause 6.5.5, "Multiplicative Operators" |
|
|
Chapter 5, "Integers" |
|
| [Seacord 2015] | |
|
Chapter 2, "Basics" |
翻訳元
これは以下のページを翻訳したものです。
NUM02-J. Ensure that division and remainder operations do not result in divide-by-zero errors (revision 82)



