Cコンパイラゼミ2024 | 2024-07-07のCコンパイラゼミ >>
switch-caseを利用した変なコード
C言語のswitch-case
デバッグに苦労したバグ
- map.cをコンパイルするとセグフォが起きる
- map_put2という関数の
map->size++;
の行でセグフォが起きる
- インクリメントを手で分解するとエラーが起きなくなる
- ここからインクリメント部分で同じノードを2回挿入している箇所が怪しいとにらむ
- gdbでデバッグをして、analyse.cの
ND_DOT
に対するパターンマッチ部分でエラーが起きているとわかる
- printデバッグをすると、
node->lhs
にはND_VARREF
が来ているとわかる
ND_VARREF
はanalyseの段階で新しく発生するノードであって、analyse前にこのノードがあるはずがない
- インクリメント部分でコピーせずにノードを入れているため、1度目に
ND_IDENT
からND_VARREF
に変換され、2度目にanalyseをすることでエラーが起こっていると判明する
副作用はside effect
GDB
また別のプログラムでセグフォが起きて、
1時間くらい延々と格闘した結果が
の部分をrdiからediに書き換えれば済むというものだった。
このアセンブリの中にmov [rax], edi
というコードがあって、ここでセグフォが起きていた。なのでraxの値がおかしいんじゃないかというところまでは予想が合ってた。でも、raxの値がおかしいのはスタックの管理を間違えたからではなくて、raxのアドレスの計算が間違っていた。何回も違う場所を疑って、結局一つ一つのアセンブリを読む羽目になった。