JPCERT コーディネーションセンター

NUM02-J. 除算と剰余演算でゼロ除算エラーを起こさない

NUM02-J. 除算と剰余演算でゼロ除算エラーを起こさない

整数に対する除算と剰余演算ではゼロ除算エラーが発生する可能性がある。そのため、整数に対する除算と剰余演算を行う前に、除数がゼロでないかをチェックする必要がある。浮動小数点数に対する除算と剰余演算は、このルールの対象ではない。

違反コード (除算)

除算演算子 / の結果は第1オペランドを第2オペランドで割った商となる。除算ではゼロ除算エラーが発生する可能性がある。また、2の補数表現の符号付き整数型の除算において、被除数が符号付き整数型の最小値 (負の値) で、除数が −1 の場合、オーバーフローが発生する (「NUM00-J. 整数オーバーフローを検出あるいは防止する」を参照)。以下の違反コード例では、符号付きオペランド num1num2 の除算時にゼロ除算エラーが発生する可能性がある。

long num1, num2, result;

/* num1 と num2 を初期化 */

result = num1 / num2;
適合コード (除算)

以下の適合コードでは、ゼロ除算エラーが発生しないよう、第2オペランドを検査している。

long num1, num2, result;

/* num1 と num2 を初期化 */

if (num2 == 0) {
  // エラー処理
} else {
  result = num1 / num2;
}
違反コード (剰余演算)

剰余演算子 % は、2つの整数型オペランドによる除算の剰余を計算する。以下の違反コード例では、符号付きオペランド num1num2 による剰余演算でゼロ除算エラーが発生する可能性がある。

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
関連ガイドライン

SEI CERT C コーディングスタンダード

INT33-C. 除算および剰余演算がゼロ除算エラーを引き起こさないことを保証する

MITRE CWE

CWE-369, Divide by Zero

参考文献

[ISO/IEC 9899:1999]

Subclause 6.5.5, "Multiplicative Operators"

[Seacord 05]

Chapter 5, "Integers"

[Seacord 2015]  Image result for video icon NUM02-J. Ensure that division and modulo operations do not result in divide-by-zero errors LiveLesson

[Warren 02]

Chapter 2, "Basics"

翻訳元

これは以下のページを翻訳したものです。

NUM02-J. Ensure that division and remainder operations do not result in divide-by-zero errors (revision 82)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter