2025-08-13
seccamp楽しそう
いままでコードは全てmain関数で実行されていたからレジスタのライフタイムはコードの初めから終わりまでで記録していた
関数定義できるようになるとスコープごとに計算する必要がある
単純なテストケースだとなぜか通ってしまうけど引数を多く渡すときや再帰関数では出力が間違っている
四則演算にバグの原因があった…
これはleft_regが破壊される副作用がある
dest_reg != left_regかつ後にleft_regを使うケースが必要だった
再帰関数でそれが出てきた
code:rs
BinOp::Sub => {
println!(" sub {}, {}", left_reg, right_reg);
if dest_reg != left_reg {
println!(" mov {}, {}", dest_reg, left_reg);
}
}
forとwhileの前に関数を作ったので再帰いろんなテストを書く
code:c
ack(m, n) {
if (m == 0) return n + 1;
if (n == 0) return ack(m - 1, 1);
return ack(m - 1, ack(m, n - 1));
}
main() {
return ack(3, 4); // 125
}
code:asm
mov rsi, 6
mov rdx, 7
mov rax, rsi
cqo
idiv rdx
mov rsi, rax
これは例外が発生したのでデバッガでレジスタを見ると直前でrdxがゼロクリアされてゼロ除算になってた