unsigned shortの不具合?

 環境は、
・HEW 4.05.01.001
・C/C++ compiler V9.01 Release 00
・C/C++ compiler V9.03 Release 00
・SH-2 E10A-USB Emulator V2.11.00
 今回の現象で再インストールしたので、現象前は V9.01 Release 00から順番にアップデートしていた。

 先日、うち内部で使用している定義の BOOLを intから unsigned shortに変更した。SH7144を使用しているので、データバスは 16ビットだから、多用している BOOLを unsigned shortに変更すれば外部 RAMへのアクセスが減るであろうことや、ヒープ領域の使用量が減るであろうことを期待してのことだ。
 コンパイルが済んで、別段何も起こらずに書き込んで(HEW+E10Aなのでそのまま)、実行した。一見何事もなく普通に動いていたのだが、良く見ると、一部の表示がおかしくなっている。
 おかしくなっていたのは数値を文字列に変換して表示している内容。
 数値の変換処理に sprintf()を使用していた。
 数値の変換処理に失敗しているのかと疑ってステップ実行すると、頻繁に HEWがフリーズする。何度も繰り返してやっとたどりついたのは、 sprintf()の作った文字列が異常だったことだ。
 さて、標準関数なので、何がおかしいかわからない。それよりも、今まで大丈夫だったのに急におかしくなった理由がわからない。もちろん、BOOLの変更は考えの外だ。
 E10Aだけではなく、Bitranの DR-01というデバッガーも使用してみたところ、CodeStageという新しいソフトでは「書き込みできません」というエラーが発生して、先へ進まず、BIT-Xという前のソフトでは書き込みできたが化けまくりで正常に動かない、という状況になっていた。(CodeStageのエラーメッセージは適切ではない。正常になった時点でやってみるとうまくいった。バイナリーの問題か。)
 HEWを削除して再インストールしたり、ディスクチェックをしてみたり。

 いろいろ試行錯誤したり、ルネサスや日立のサイトや Googleで検索してみたところ、ルネサス(か日立)のサイトで、以前のコンパイラーで unsinged short関連の不具合とかの情報が見つかった。バージョンは 7だったのだが、今朝試しに、BOOLを intに戻して再コンパイルしてみたところ、何事もなく正常に動作するようになった。

 昨日の試行錯誤は何だったのか...

 これでまた 日立の Cコンパイラーに対する不信感は増えた。
 今回のように目に見えておかしければいいのだが、わかりにくいところでおかしくなっていたら気がつかない。
 (まあ、だからといって GCCなら大丈夫ってわけでもないが。80x86などならいざしらず、SH2ならテストする人数も多くないと思われるので。(使ってて気付くかどうかという点で))

 unsigned shortとかなら WORDでしか使わないが、intや doubleなんかでわからないところで計算間違いなんかされてたら目も当てられない。

 がんばってよ。日立さん。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 2

驚いた 驚いた

この記事へのコメント

この記事へのトラックバック