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