XC8コンパイラバグ踏み!

マイクロチップさん、それはないっしょ!
IoT機器の開発なんてことを手掛けていて、秋月とかで安価に入手できるのでPICマイコンを愛用しているのだが、C開発環境の MPLABX IDE v5.20 & XC8 v2.05 でいまだかつて踏んだことの無いバグを見事に踏んづけてしまった。
return 文のコメントに「不能」という文字が含まれるとコンパイルエラーが出る。
例) return 0; // 不能
もちろん、コメントはプログラム的には無視されるはずなのにコンパイルエラーが出るなどということは起こりえるはずはない。しかも、プログラム中のどのreturn文でも再現性100%である。なんてこったい。こんなバグのおかげでまるまる1日費やしてしまった。時間返せ!

コメント:

H.Y:不可

創結マスター:深い意味があるのか?

H.Y:不可解ですね

創結マスター:不能って、何か深い意味が隠されてるとか・・・

H.Y:能ではなくて狂言ですよ

M.S:予約語だね

創結マスター:気持ち悪いので、ついでに解析もしてみた。
日本語文字コードはShift-JISを使ってる。今は、UNICODEが一般的だが、プログラムサイズを小さくするのとLCDにカタカナ表記をするのにShift-JISがやはり使い勝手が良いため。
で、不能のShift-JISを調べてみると、
不 95 73
能 94 5C
それぞれの1文字コードを対応させると
95=なし 73=s
94=なし 5C=\
となる。おおっ!問題多きバックスラッシュ登場!
あるときいは円マーク、そしてあるときはバックスラッシュ
なるほど~
C言語では、1行の最後にバックスラッシュが来ると改行コードを無いものとして扱うため、次の行とつなげて解釈することとなる。そのため、2行が塊として構文解析された結果、エラーとなったと。
ふむふむ。日本語を扱う時は気を付けないとねぇ。マイクロチップのサポートセンタに教えてあげよう。

K.S:素晴らしい解析だ。しかし、コンパイルの際に、//の後ろにあるコードは、単に無視すればいいだけのはずなんだが、創結マスターさんの予想通りだとすると、妙なコンパイラ仕様だな。

K.S:行を読み込む際に、次の行も含めて読み込んでしまう。そのうえで//から後ろは無視してしまう。だからコンパイルエラーか。なるほど。

H.N:確かに変ですね. /*不能*/だったらエラーは出ないってことですかね.

創結マスター:能」の文字が行末になければ大丈夫です

T.T:なるほど‼

タイトルとURLをコピーしました