• Imagix 4D ユーザガイド
  • 目次

[クリティカルセクションの不一致] レポート

割り込み有効/無効の呼び出しやセマフォをタスク内で使用する際に発生する可能性のある問題は、[クリティカルセクションの不一致] レポートおよび[クリティカルセクションでの呼び出し] レポートによって検出されます。これらのレポートはどちらも、クリティカルセクションのメカニズムを最初に特定する必要があります。これはC/C++プログラムでは明示されていないためです。

[クリティカルセクションの不一致] の解析では、クリティカルな(保護された)領域の開始と終了の不一致を特定します。また、このレポートでは、クリティカルな領域における、コードの特定の行の有無について不明確なエリアを示します。そのような問題は、保護されていない割り込みに対してソフトウェア・システムを脆弱な状態のままとし、またロジックに関するその他の問題を示唆する可能性があるのです。

関数呼び出しの始点と終点を指定することによって、クリティカルな領域を定義します。プロジェクト内で検出された各関数呼び出しの始点について、レポートはプログラムもしくはタスクの最後まですべての実行パスをチェックし、一致する関数呼び出しの終点を検索します。欠如しているものがある場合、レポートには呼び出しの起点と、呼び出しの終点が欠如している最も近いパスが示されます。次に、レポートは関数呼び出しの終点から、すべての実行パスを逆行して調べ、プログラムあるいはタスクの先頭に戻るまで、一致する関数呼び出しの始点を検索します。対応するものが見つからない場合、レポートは関数呼び出しの終了地点と、呼び出しの開始が欠如している最も近いパスを示します。

該当する行へのパスによって、ソースコード内の行の保護状態が左右される場合に、不明確な箇所が発生すると考えられます。本レポートでは、この解析の一環として、呼び出し先、または呼び出し元となる関数をすべてチェックします。例として次のスクリプトを取りあげます。

int globalX = 1;

void funcC() {
    int localC = 1;
    if (localC) {
        globalX = 1;
        EnableInt();
    } else {
        globalX = 2;
    }
}

void funcB() {
    int localB = 1;
    if (localB) {
	DisableInt();
        globalX = 1;
    } else {
        globalX = 2;
    }
}

void funcA() {
    funcB();
    funcC();
}


int globalY = 1;

void fc() {
  globalY = 2;
}

void fa() {
  DisableInt();
  EnableInt();
  fc();
}

void fb() {
  DisableInt();
  fc();
  EnableInt();
}

void ftop() {
  fa();
  fb();
}

上記の例では、特定の条件パスのみが保護されるため、クリティカルな領域に対する入出力の双方に問題があります。このレポートの出力結果には両方の問題が表示され、開始あるいは終了が欠如している最も近いパスが指摘されます。このレポート結果を得ることによって、不一致のレビューに着手することが可能となります。

Mismatched Critical Regions

Settings:
        Critical Region:         CR ( DisableInt / EnableInt )
                                 
        Regions Missing Starts:  displayed
        Regions Missing Ends:    displayed
        Ambiguous Functions:     displayed
        Ambiguous Regions:       displayed

Task Definitions
Tasks are from Auto Task Generation: Any root functions
Name                Members  Graph  Root
autotask 1 - ftop         6    [+]  ftop
autotask 2 - funcA        5    [+]  funcA


Critical Region:  CR

Start of Critical Region                          Missing End of Critical Region
Function            Line File                     Function            Line File
funcB                 17 mismatched_cr.c          funcB                 21 mismatched_cr.c

Missing Start of Critical Region                  End of Critical Region
Function            Line File                     Function            Line File
funcC                  7 mismatched_cr.c          funcC                  8 mismatched_cr.c

Ambiguous Functions
Function            Line File
fc                    32 mismatched_cr.c
funcC                  4 mismatched_cr.c

Ambiguous Regions
File                Lines
mismatched_cr.c     (all) 5 6 7 10 11 21 25 26 33