次のコードを検討してください。
volatile int status;
status = process_package_header(&pack_header, PACK_INFO_CONST);
if ((((status) == (SUCCESS_CONST)) ? ((random_delay() && ((SUCCESS_CONST) == (status))) ? 0 : side_channel_sttack_detected()) : 1))
{
...
}
このマシンコードを生成します (ツールチェーンのobjdumpで生成されます):
60: f7ff fffe bl 0 <process_package_header>
64: 9000 str r0, [sp, #0] /* <- storing to memory as status is volatile */
66: 42a0 cmp r0, r4 /* <- where is the load before compare? status is volatile, it could have change between the last store instruction (above line) and now */
68: d164 bne.n 134 <func+0x134>
6a: f7ff fffe bl 0 <random_delay>
現在、は揮発性であるため、ステートメントに到達status
したときにメモリから読み取られているはずです。関数からの戻り値が割り当てられ、メモリに格納されているという事実に関係なく、 ( ) をif
と比較する前に、いくつかのロード コマンドが表示されることを期待します。cmp
SUCCESS_CONST
process_package_header()
status
str
cmp
条件の動機を無視するようにしてくださいif
。その目的は、条件フラグとレジスタが物理的な機器によって外部から変更される可能性のある CPU に対する物理的な攻撃を検出することです。
ツールチェーン ARM DS-5_v5.27.0 ARMコンパイラ: ARMCompiler5.06u5 (armcc)
ターゲットはARM CortexM0+ CPU