CXX.INT_TO_FLOAT.CONV
算術演算における暗黙変換の使用
このチェッカーは、浮動小数点演算のためにコードが整数を浮動小数点形式に暗黙に変換しようとすると、欠陥を報告します。
脆弱性とリスク
浮動小数点変数に代入する値を計算する整数演算を使用すると、情報が失われる可能性があります。
軽減と防止
この指摘は、式中の整数の 1 つを浮動小数点型に変換することで回避できます。
脆弱コード例 1
void func(void) {
short a = 533;
int b = 6789;
long c = 466438237;
float d = a / 7; /* d is 76.0 */
double e = b / 30; /* e is 226.0 */
double f = c * 789; /* f may be negative due to overflow */
}
この非準拠コード例では、除算と乗算が整数で行われた後、浮動小数点値に変換されます。その結果、浮動小数点変数 d、e、および f は値が浮動小数点値に変換される前に計算されてしまい、正しく初期化されません。その結果、一番近い整数に切り捨てられるか、オーバーフローする可能性があります。
Klocwork は、5 行目、6 行目、および 7 行目で「整数型から浮動小数点型への変換により情報が失われる可能性がある」という CXX.INT_TO_FLOAT.CONV 欠陥を報告します。
修正コード例 1
void func(void) {
short a = 533;
int b = 6789;
long c = 466438237;
float d = a / 7.0f; /* d is 76.0 */
double e = b / 30.0; /* e is 226.0 */
double f = (double)c * 789; /* f may be negative due to overflow */
}
修正されたこの例では、除算のオペランドの少なくとも 1 つが浮動小数点であると確認されることで初期化の 10 進エラーが排除されるため、Klocwork はもはや欠陥を報告しません。
脆弱コード例 2
void func(void) {
short a = 533;
float d;
d = a / 7; /* d is 76.0 */
}
この例では、除算が整数で行われた後、浮動小数点値に変換されます。その結果、浮動小数点変数 d は値が浮動小数点値に変換される前に計算されてしまい、正しく初期化されません。
Klocwork は、5 行目で「整数型から浮動小数点型への変換により情報が失われる可能性がある」という CXX.INT_TO_FLOAT.CONV 欠陥を報告します。
修正コード例 2
void func(void) {
short a = 533;
float d = a;
d /= 7; /* d is 76.14286 */
}
この例では、最初に整数を浮動小数点変数に格納してから算術演算を実行することで初期化の 10 進エラーが解消されるため、Klocwork はもはや欠陥を報告しません。この方法では、オペランドの少なくとも 1 つが浮動小数点数になり、後続の算術演算が浮動小数点オペランドで実行されます。