文の意味変わらないし、句読点ってなんなん?(1)
さて、前回で"hoge.c"をコンパイルしたときコマンド無しで"hode.out"となるような改造を実装できた。そこで次の目標を立てることにした。
みなさん、こんにちわ
と
みなさん、こんにちわ。
とで相手に伝わる意味が変わるのだろうか。変わらない。
あくまで句読点は文法上のルールであって意味が通じればいいじゃん!って場面では必要ないのではないか?
これって、C言語でも同じじゃないか??
printf("Hello World");
と
printf("Hello World")
とで意味変わらないだろ!理解しろよ、gcc!
と御託を並べたが、僕はたまに打ち漏らす";"によってコンパイラーに弾かれるとき「許してくれよ〜」ってなり書きなおすのが億劫だなって。
ここで次の目標を
test.c: In function ‘main’:
test.c:5:5: error: expected ‘;’ before ‘}’ token
}
^
このエラーを吐かないようにすること、とした。
具体的には
wrong.c:
int main(){
printf("Hello World")
}
がコンパイラーを通るようにしよう!ということである。
a.out の時と同じでエラーを吐いているところに至るまでデバッグを行い、直前の関数に入っていくことを考えた。
するとdo_spec()関数が-1を返している時にエラーを吐いていることがわかった。do_spec()関数は次の意味不明な文字列を再帰的に処理していた。
spec=0x485410 "%{E|M|MM:%(trad_capable_cpp) %(cpp_options) %(cpp_debug_options)} %{!E:%{!M:%{!MM: %{traditional:%eGNU C no longer supports -traditional without -E} %{save-temps|traditional-cpp|no-integrated-cpp:%(trad_capable_cpp) \t %(cpp_options) -o %{save-temps:%b.i} %{!save-temps:%g.i} \n\t cc1 -fpreprocessed %{save-temps:%b.i} %{!save-temps:%g.i} \t %(cc1_options)} %{!save-temps:%{!traditional-cpp:%{!no-integrated-cpp:\t cc1 %(cpp_unique_options) %(cc1_options)}}} %{!fsyntax-only:%(invoke_as)}}}}")
do_spec()の引数の一つが"as %(asm_options) %m.s %A"となった時にプログラミングは落ちており、そのとき呼び出される関数に繰り返し入って行くとexecute() gcc.c:2899→pex_run()関数→obj->func->exec_child()関数→vfork()でエラーメッセージを吐いていることが発覚したが、その中身はアセンブリだった…
\(^o^)/オワタ