コンパイラーのバグ

ふと思い出した

10年ほど前にSolaris9で開発していた頃のことをだらだらと。
(もうそんなに経ったか・・・)

C++コンパイラのバグ(?)で悩まされた。

うろ覚えだけど、こんな感じのreturn漏れのコード(適当

int hogera(int b, int c) {
  int a = b + c;
  if (a = 0) {
     return 0;
  }
  // return nil
}

通常

上記はreturn漏れのコンパイラ警告だかエラーになるはずが、何故か問題なくコンパイルできてしまった。
結局、リリース後に発覚して大騒ぎだった記憶。

その時はSun(現Oracle)のサポートに連絡し、調べてもらって結論が「バグ」だったような。

と言っても

Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと #2/3を読むと、必ずしもバグだけでなく、あれは最適化の影響だったのではと今では思ったり。

リリースをするときは必ず、Releaseモードでビルドするしね。

それ以来

どうしても解消しないバグの要因の一つとしてコンパイラも疑う癖がついてしまった。

Oracle9i/11gでも

バグっぽいものを見つけた。

SQL単体で実行すると正しい結果が返ってくるのに、PL/SQLにすると何故かうまく実行できない。

他にも、特定のSELECT文を実行直後に別のSELECT文を実行すると、結果が異なるなど。。。

結局Oracleサポートに入ってなかったので、バグ報告は上げてない(笑

大抵

しょぼいミスが原因。

だからできるだけシンプル、できるだけコンパクトにして、バグが混入しにくいコードを書くように心がけている。

1関数50行を目標にしてはいるけど、トリッキーなコードを使わないコンパクトって、なかなか難しいよね。