char型を文字列以外の用途で用いちゃいけない訳 - 多重人格

char型を文字列以外の用途で用いちゃいけない訳

 急に思い出したけど僕は開発者なので、たまには開発者っぽいことも書いていこうと思う。C言語の話。先日char型の変数のせいでえらい目にあった。

 簡単なコーディングなので見てみてほしい。例えば下記のようなコード。

char flag = -1;

if (flag == -1) {
hoge();
}

 このコード、char型のflagが-1になっていたら、hoge()関数が実行されるんですが、先日僕がこのようなプログラムを動かしたところ、どうもhoge関数が実行されない。だってif文の前で-1ってやってんだよ!? 意味分からないじゃない?

 したらお前、ここがC言語というかコンパイラの罠ですよ。

if(flag == -1)

の判定文。なんとflagが4バイトのintにキャストされてたわけです。しかもえらく変な感じでキャストされてた。charは1バイトの整数値なので、それがintにキャストされるとどうなるかと言うと、

符号付きcharの-1の16進数表記 : FF → -1
↑を4バイトintにキャストしたときの16進数表記:00 00 00 FF → 255

つまり僕が直前で-1と定義した値がすばらしきコンパイラさんのおかげで255になっていたわけです。そら駄目だ。

 もちろん頭のいいコンパイラによっては、intにキャストしたとしても-1として扱ってくれる事もあります。が、僕のプロジェクトで使ってる妙な野良コンパイラはアホなのでこういうことになったわけ。

 でもでも。コンパイラがアホだからーで済ませる問題ではない。このコード、頭いいコンパイラでコンパイルされるとは限らないからだ。通常、書いたコードが他に流用されないなんてことはあり得ない。色んなプロジェクトで流用されると考えたほうがよい。流用されるプロジェクトによってはアホコンパイラもあるだろうし、賢いコンパイラもいるわけで。そういった事を考えるとコンパイラ依存の上記コードは絶対書いちゃいけない。
 だから、こう直しましょうね。っていう話。

int flag = -1; ★

if (flag == -1) {
hoge();
}


 バカみたいな話だけど、misra-cのコーディング規約にも明記されている話だったりする。


http://www.openrtp.jp/wiki/_hara/ja/RtORB/MISRA-C-RULE.html


6.1 R 単なるchar型は、文字データの格納及び使用に限って用いなければならない。
6.2 R signed char型及びunsigned char型は、通知データの格納及び使用に限って用いなければならない。

この1文だけ見ると、なんで? って思いますがこういう事例があるとよく分かりますね。

 そもそも僕がこんなflagをchar型で定義してしまったのは、なぜかAndroidで書いたコードをC言語に流用してよ? 流用だから簡単でしょ? 3キロLineを1ヶ月で。とかキチガイみたいなことを言われ、時間もねーしjavaのbyte型をそのままcharに置換してたからで、最初からC言語で書いてたらこういうことはしなかったっつーかぶつぶつ……

【ニコ動でゲーム実況してました。】
ニコニコ動画ゲーム実況一覧

【twitter】気軽にフォローしてください→@yhei_hei

このエントリーをはてなブックマークに追加

 Y平 (31)

現在:
Androidプラットフォーム開発者。シナリオ作成も趣味でコンテストに
色々応募をしています。人形劇もやっています。

略歴:
2004年〜2009年 名古屋大学で人形劇サークルで活動後、作家を目指すも挫折。
2009年〜 札幌のモバイルの会社に勤めて適当にプログラミングやらに従事。
2012年 ヒューマンアカデミー シナリオライター講座受講。シナリオライターに。
2013年4月、妻と結婚
2015年8月、オモコロライターになる

作品暦:
「えんむすび」 子供映画製作ワークショップ2012最終候補
「思い出はとめたままに」 2012年南のシナリオ大賞 落選
「マリモの人形劇」アニメシナリオ大賞 選考中(2015年4月現在)
「しっくす・パックす!」第22回電撃コミック大賞 選考中(2015年4月現在)
「上から」コバルト短編小説新人賞 選考中(2015年8月結果発表)

好きな作家:
筒井康隆 綿矢りさ 星新一 藤子・F・不二雄 戸塚たくす

その他活動:
ニコニコ動画ゲーム実況一覧
twitter 気軽にフォローしてください→@yhei_hei

mail :
yheihei0126●gmail.com(●を@に変えてね)
↑感想やらお仕事やら日々の呟きやらなんでもください↑

コメント
非公開コメント

えっ…と

パルスのファルシのルシがパージでコクーンってことで…おk?

2014-09-16 11:54 | from 通りす…

バロスwwww確かに専門外の人が見たらその例えは的を射てるwww

2014-09-16 11:58 | from わいへい

arm gccの罠

ARM GCC だと char は符号無しなんですよね。。。。
コンパイラの警告レベルを最大にしてもまれに見逃してしまいます。

2015-05-01 04:42 | from 同じところにはまったPG

No title

同じところにはまったPGさん>
>ARM GCC だと char は符号無しなんですよね。。。。
あー! なるほど。実はこれビルドしたのARMコンパイラなんすよ。
するてーと char hoge = -1の時点で255に解釈されてるんすかね。
それで-1と比較して駄目になってた的な。
勉強になります。いずれにしてもcharに数値、駄目、絶対ですね。

2015-05-03 08:26 | from わいへい

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

2015-06-27 22:26 | from -

トラックバック

http://tajuujinnkaku.yhei.net/tb.php/499-2486495c