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