EN JP CN

DBZ.CONST

DBZ.CONST

ゼロ定数値は、除算やモジュロ演算の除数としてゼロが直接的に使用されます

ゼロを除数として除算やモジュロ演算に使用しようとすると、ランタイムエラーが発生します。ゼロによる除算の欠陥は、効果的でないエラー処理または競合状態のためにしばしば起こります。通常、プログラム終了の異常が発生します。値が C/C++ コードにおいて除算またはモジュロ演算の除数として使用される前に、ゼロに等しくないことを確認するためにチェックする必要があります。

DBZ チェッカーは、除算やモジュロ演算の除数としてゼロが使用されているインスタンスを検索します。

DBZ.CONST チェッカーは、除算やモジュロ演算の除数としてゼロが明示的に使用されている状況にフラグを立てます。

脆弱性とリスク

通常、整数のゼロによる除算は、プロセスの失敗や例外を引き起こします。また、演算は成功するかもしれませんが、結果に誤りとなります。浮動小数のゼロでの除算は、より分かりにくくなります。これは、コンパイラの実装に依存しています。コンパイラが IEEE 浮動小数点標準規格 (IEEE 754) に従う場合、浮動小数をゼロで除算した結果は明確なものとなります。しかし、C および C++ 標準規格は IEEE 754 規格への準拠を強制しません。従って、浮動小数のゼロでの除算の結果は、C および C++ では明確ではなく、従って、プロセスが失敗したり例外が発生したりする可能性があります。

ゼロによる除算の指摘は通常、効果的でない例外処理が原因で発生します。この脆弱性を回避するために、除算やモジュロ演算の除数としてゼロを使用しないでください。

脆弱コード例

1  int do_dbz()
2  {    
3      int size = 10;
4      return size / 0;
5  }

Klocwork は 4 行目で指摘レポートを生成し、4 行目の除算の除数としてゼロ定数値を使用していることを示します。ゼロで除算することにより、予期しない結果や意図しない結果となる可能性があります。

このコードはゼロによる除算を削除することによって修正することができます。

外部参考資料

制限事項

このチェッカーは、整数型でのみ動作します。浮動小数点型では動作しません。つまり、浮動小数点型の関連する欠陥はこのチェッカーでは検出されません。以下は、このような、検出されなかったゼロによる除算の例です。
1  int do_dbz()
2  {
3      int size = 10;
4      return size / 0.0;   // Not detected here since it is a floating-point constant.
5  }