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

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

除算および剰余演算は、ゼロ除算エラーを引き起こす可能性がある。

Cでは、除算と剰余演算が未定義の動作を引き起こす2つの条件が指定されている。

UB 説明

45

/ または % 演算子の 2 番目の オペランドの値がゼロである(6.5.5)。

n/a a/b が表現不可能な場合、a/ba%b の両方とも動作は未定義である(6.5.5)。
除算

/ 演算子の結果は、第1オペランドを第2オペランドで除算した商である。除算演算は、ゼロ除算エラーを引き起こす可能性がある。また、被除数が符号付き整数型の最小値(負の数)に等しく除数が−1に等しい場合、2の補数による符号付き整数型の除算時にオーバーフローが発生する可能性がある。(「INT32-C. 符号付き整数演算がオーバーフローを引き起こさないことを保証する」を参照。)

違反コード

以下のコード例は、符号付きのオペランド sl1sl2 による除算時にゼロ除算エラーを引き起こす可能性がある。

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つの整数型オペランドによる除算を行った際の剰余を計算する。

違反コード

以下のコード例は、符号付きオペランド sl1sl2 の剰余演算時にゼロ除算エラーを引き起こす可能性がある。

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
248 S

部分的に実装済み
PRQA QA-C 8.1

2830 (C)
2831 (D)
2832 (A)
2833 (S)
2834 (P)

実装済み
関連するガイドライン
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)

Top へ

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