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

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;
}
リスク評価

ゼロ除算エラーはプログラムの異常終了やサービス運用妨害につながる可能性がある。

ルール 深刻度 可能性 修正コスト 優先度 レベル
NUM02-J P6 L2
自動検出

CおよびC++における自動検出ツールは存在するが、Javaではまだ存在しない。

関連ガイドライン
CERT C Secure Coding Standard INT33-C. Ensure that division and modulo operations do not result in divide-by-zero errors
CERT C++ Secure Coding Standard INT33-CPP. Ensure that division and modulo operations do not result in divide-by-zero errors
MITRE CWE CWE-369. Divide by zero
参考文献
[ISO/IEC 9899:1999] Section 6.5.5, Multiplicative operators
[Seacord 05] Chapter 5, Integers
[Warren 02] Chapter 2, Basics
翻訳元

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

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

Top へ

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