メインコンテンツ

AUTOSAR C++14 Rule A4-7-1

An integer expression shall not lead to data loss

R2021b 以降

説明

ルール定義

An integer expression shall not lead to data loss.

根拠

明示的なキャストを行う場合や、整数式が暗黙的な変換、オーバーフロー、アンダーフロー、またはラップアラウンドの原因になる場合、データ損失が発生する可能性があります。次に例を示します。

  • uint16_t から uint8_t への暗黙的な変換では、より大きいデータ型の上位バイトが破棄されます。

  • オーバーフローを引き起こす符号付き整数の演算式は、未定義の動作です。

予期しないデータ損失が発生しないようにするには、次のようにします。

  • 整数型の変換を回避するために、すべての演算を同じ型で行います。

  • 他に考えられるデータ損失の原因に対処するのに適切なガード (アサート、if ステートメントなど) を使用します。

Polyspace 実装

  • Polyspace® は、データ損失の原因となる可能性のある以下の整数式にフラグを設定します。

    • オーバーフローを引き起こす、符号付きまたは符号なし整数変数に対する演算。

    • コンパイル時定数の値を格納できないデータ型を持つ符号付きまたは符号なし整数へのコンパイル時定数の代入。

    • 符号付き (符号なし) 整数から、より範囲が狭い符号付き (符号なし) 整数型への変換。

    • 符号なし整数から符号付き整数への変換。

    • 結果のデータ型では表せない値を生成するシフト演算。

  • Polyspace は、より範囲が狭い型にキャストするための static_cast の使用にはフラグを設定しません。これらの変換によってデータ損失が発生する可能性があるとしても、このソフトウェアはそれを意図的なものであると見なします。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因として考えられる場合、既定の Bug Finder 解析ではこのルールに対する違反が報告されない場合があります。特定のシステム入力値を原因とする違反の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <iostream>
#include <cstdint>
#include <stdexcept>
#include <climits>

uint8_t sum(uint8_t a, uint8_t b) noexcept
{
    return (a + b); //Non-compliant
}

uint8_t sum_check(uint8_t a, uint8_t b)
{
    if (b > UCHAR_MAX - a) {
        throw std::range_error("Operation overflows");
    }
    return (a + b); // Compliant
}

int16_t increment(int16_t var)
{
    return ++var; //Non-compliant
}


void func()
{

    uint8_t small_sum = sum(50, 50);
    uint8_t large_sum = sum(150, 150); 
    try {
        uint8_t large_sum_check = sum_check(150, 150);
    } catch (std::range_error&) {
        //Handle error
    }

    int16_t max_var = increment(SHRT_MAX);

}

この例では、Polyspace は次に対してフラグを設定します。

  • sum() の return ステートメント。sum() の 2 番目の呼び出しで large_sum を初期化すると、オーバーフローが発生します。これは、入力パラメーターの和が、戻り値の型 (uint8_t) のサイズを上回るためです。

  • increment() の整数式。max_var の初期化中にこれを呼び出すと、SHRT_MAX のインクリメントが試行されるためです。

Polyspace は、sum_check の return ステートメントにはフラグを設定しません。この関数は自身の入力の範囲をチェックして、large_sum_check が初期化されている場合はエラーをスローするためです。

チェック情報

グループ: 標準変換
カテゴリ: Required、Automated

ヒント

Polyspace Bug Finder™ は、入力の値について特定の仮定を行います。Bug Finder 解析の前提条件を参照してください。

ランタイムは長くなりますが、欠陥を表示するときに、呼び出されていない関数の入力を含む関数入力のすべての値が考慮される、より徹底的な解析を実行できます。[システムのすべての入力値を考慮する、さらに厳密なチェックを実行 (-checks-using-system-input-values)] を参照してください。

バージョン履歴

R2021b で導入