GNATstack

GNATstackは、Ada/C/C ++ソフトウェア開発時に組込アプリケーションが必要なメモリスタックの最大サイズを予測する静的解析ツールです。
GNATstackは、アプリケーションの各タスクが必要な最大スタックスペースを静的に計算し、十分なスペースを確保できるため、スタックの使用に関して安全な実行が保証されます。 このツールは、サブプログラムの再帰などの複雑さにも対応し、不要なスペースの確保を回避できます。

静的スタック解析ツールは、コンパイラが生成したデータを利用して、最悪の場合のスタック要件を計算し、制御フロー解析と組合せて、サブプログラムごとのスタック使用量を計算します。

 

GNATstackはオブジェクト指向アプリケーションを解析し、Ada/C ++の両方で動的ディスパッチを使用するコードの最大スタック使用量を決定できます。 呼び出されるサブプログラムのIDは実行時までわからないため、ディスパッチングコールは静的解析を行います。ディスパッチコールごとに、ターゲットのサブセットを静的に決定して、この問題を解決します。そのため、解析の時間を削減し、複雑なAda / C ++コードでも正確なスタック使用量を決定できます。

この計算は、コンパイル時の既知の情報に基づいているため、 全ての結果を表示する場合、計算された範囲を超えることはありません。
一方、サブプログラムの再帰の深さ、間接コールなどの情報が不足している場合、全ての結果は表示されず、不明なコールグラフとスタック使用状況情報を指定できる内容を示します。

表示内容は、すべてのエントリポイントのワーストケースのスタック使用量とそのパスで、エントリポイントのリストは自動的に計算(すべてのタスク)、あるいは指定可能です。(エントリポイントのリストまたは正規表現に一致するサブプログラム)。

 

GNATstackは、スタック要件を計算する際に潜在的な問題を検出して一覧表示することもできます。
・ 関節接コール(ディスパッチ含む):サブプログラムからの間接コール数を表示
・ 外部コール:スタックまたはコールグラフ情報が存在しないエントリポイントから到達可能なすべてのサブプログラムを表示
・ 無制限のフレーム。:任意のエントリポイントから到達可能で、制限のないスタック要件を持つサブプログラムを表示。 たとえば、必要なスタックサイズがサブプログラムの実際のパラメータに依存している場合に、この状況が発生する可能性があります。
・ サイクル:コールグラフ内のすべてのサイクル(潜在的な再帰)を検出。

 

GNATstackは、間接コール先、外部コールのスタック要件、無制限のフレームの境界などの不明な情報をファイル化できます。