4

手動でコーディングされたアセンブリコードにプラットフォームのアセンブリ呼び出し規約の違反が含まれている場合に、アセンブラ(または静的アナライザ)が警告する方法はありますか?

私が使用しているプラ​​ットフォームは、GNUGASアセンブラを備えたARMv7Aです。質問の理由は、私の関数が必要なレジスタ(ARMではr4-r11)をupunにプッシュ/ポップしなかったときに書いたバグです。レジスターがゴミ箱に捨てられ、発信者がクラッシュしました(ありがたいことに、自動テストでバグが検出されました)。簡略化されたプログラム:

my_function:
    mov     r4, #42  @Trash register r4 in violation of calling convention
    bx      lr       @Return from function

caller:
    ...
    mov r4, #4        @Initialise register r4, to be used later
    bl my_function    @Call my_function with no arguments
    mov r0, r4        @Set argument r0 as r4 (== 42, but should be 4)
    bl other_function @Call other_function with (the now trashed) argument r0

ARM呼び出し規約: http: //infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

4

1 に答える 1

0

そのようなツールはないと思います。アセンブリプログラマーは、自分たちが何をしているのかをよく知っていることが期待されます。

ただし、本当にそれを追いかけているのであれば、そのようなツールを開発することができます。

その中で、アセンブリソースコードを解析し、サブルーチンによって保存する必要のあるレジスタを変更する命令を認識する必要があります。それらのレジスタを保存/復元する手順についても同様です。

また、サブルーチンの開始位置と終了位置を把握する必要があります。サブルーチンへのエントリポイントを指定するラベルは、基本的に、リンカーによって外部から見えるようになっているパブリック/グローバル/その他として定義されていることに注意して、最初の部分を認識できます。別の可能なヒューリスティックは、ラベルが呼び出し命令、またはそれに相当するもので使用されていることを確認することです。同様に、リターンを実行する命令またはそれらのシーケンスに注意することにより、サブルーチンの終了を判別できます。

始まりと終わり、またはレジスターが本当にゴミ箱に入れられているのか、保存されているのかを理解するのが難しい場合があります。それらのいくつかは、追加のヒューリスティックで解決できます。残りはデフォルトで警告が発生する可能性があります。フォールスネガティブ、フォールスアラーム、およびその逆を行う方がおそらく良いでしょう。コードが小さい場合、警告が意味があるかどうかを判断するのは簡単です。

このタスクでは、文字列を適切に処理し、正規表現をサポートし、それらを処理する「標準」コンテナーとアルゴリズム(検索/ソートなど)をサポートできるスクリプト言語またはスクリプト言語を検討する必要があります。PerlとPythonはその仕事をうまくやることができます。開発プロセスで多数の小さな部分を書き直して破棄する必要があるため、CまたはC++で実行することはお勧めしません。コンパイルは余分なハードルですが、どんなに小さくてもかまいません。低レベルのコードやテンプレートをデバッグするのは楽しいことではありません。

于 2012-10-02T01:09:06.837 に答える