メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

アサーション

失敗したアサート ステートメント

説明

この欠陥は、assert を使用し、そのアサートされた式が false であるか false になる可能性がある場合に発生します。

メモ

Polyspace® では、assert(0) にアサーションの欠陥であるというフラグは立てません。こうしたステートメントは一般に、コードの特定セクションを無効にするために使用されるからです。

リスク

通常、デバッグ モードでの機能テストには assert ステートメントを使用します。静的解析を使用してアサーションの失敗が見つかった場合、対応する機能テストが実行時に失敗することを示しています。

修正方法

修正方法は欠陥の根本原因によって異なります。たとえば、根本原因が、外部ソースからの制約のない入力であり、これが最終的にアサーションの失敗につながっている場合があります。

多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

チェッカーの拡張

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

すべて展開する

#include <assert.h>

void asserting_x(unsigned int theta) {
    theta =+ 5;
    assert(theta < 0);
}

この例では、関数 assert は入力変数 theta がゼロ以下であるかどうかをチェックします。theta は符号なしの整数で、関数の開始時の最小値がゼロであるためアサーションは失敗します。+= ステートメントにより、この正の値は 5 増加します。したがって、theta の範囲は [5..MAX_INT] です。theta は常にゼロより大きくなります。

修正 — アサート式を変更

1 つの修正方法として、アサート式を変更することができます。"より小か等しい" 記号を "より大か等しい" 記号に変更することによって、アサーションの結果が false でなくなります。

#include <assert.h>

void asserting_x(unsigned int theta) {
    theta =+ 5;
    assert(theta > 0);
}
修正 — コードを修正

1 つの修正方法として、アサート式に関係するコードを修正することができます。アサート式が true の場合、アサーションが成功するようにコードを修正します。

#include <assert.h>
#include <stdlib.h>

void asserting_x(int theta) {
    theta = -abs(theta);
    assert(theta < 0);
}
#include <assert.h>

#define FLAG 0

int main(void){
    int i_test_z = 0;
    float f_test_z = (float)i_test_z;

    assert(i_test_z);
    assert(f_test_z);
    assert(FLAG);

    return 0;
}

この例において、Polyspace は、assert(FLAG) に違反のフラグを立てません。マクロによって FLAG0 と定義されているからです。Polyspace Bug Finder™ のアサーション チェッカーでは、定数 0 のパラメーターをもつアサーション assert(0) にフラグは立てません。こうしたタイプのアサーションは一般に、実行時の動的チェックとして使用されます。assert(0) を挿入することにより、プログラムが実行時にこのステートメントに到達してはならず、到達した場合はクラッシュするということが示されます。

ただし、assert(i_test_z) および assert(f_test_z) の例で見られるように、アサーション チェッカーは 0 に等しい変数値によるアサーション失敗にはフラグを立てます。

結果情報

グループ: プログラミング
言語: C | C++
既定値: オン
コマンド ライン構文: ASSERT
影響度: High

バージョン履歴

R2013b で導入