Hatena::

それ、Gentooだとどうなる?

2009-07-17

GCC 4.4時代のC++プログラミング(C++プログラマーの受難な日々の巻)

C++プログラマーや各ディストリビューションのパッケージメンテナーは必見。GCC 4.4 + glibc 2.10でハマらない為のテクニック。

詳しくはリンク先を参照。執筆者は今のGentoo界を牽引する我らがリーダー、Diego E. “Flameeyes” Petten〓先生。

Flameeyes’s Weblog : How _not_ to fix GCC 4.4 bugs

ざっくり要約

#include <cstring>
int main() {
  char *foo = strchr("ciao", 'a');
}

は、GCC 4.3までは問題ないが、GCC 4.4だとエラーになるぜ。

error: invalid conversion from ‘const char*’ to ‘char*’

でも決してこんな対策はすんな。目をつぶってるだけだ。

#include <cstring>
int main() {
  char *foo = (char*)strchr("ciao", 'a');
}

で、こうするのがいいんだが、

#include <cstring>
int main() {
  const char *foo = strchr("ciao", 'a');
}

constになっちまうのは困るんだろ?じゃあこうだ。

#include <cstring>
int main() {
  char *foo = const_cast<char*>(strchr("ciao", 'a'));
}

つまり、型キャストはC言語流ではなくC++言語流でやれ、っつーことだ。

現時点でその影響が判明しているソフトウェア

で、Gentoo界ではFlameeyes先生が調査しまくってて各所で絶賛対応中

次の日本発(?)系ソフトウェアでも影響があることが判明している。

  • canuum
  • ochusha
  • scim-bridge
  • w3mmee

まだまだ他にもたくさんありそうだ。恐ろしや。

GCC 4.3も落とし穴があって大変だった*1が、GCC 4.4もパッケージメンテナー泣かせ。C++プログラマーの皆様、お願いだからしっかりきっちり書いてね。またはC++を使わないでくれ。

*1:ちゃんと#include <cstring>しろとか2回#defineすんななど。

faith_and_bravefaith_and_brave 2009/07/20 14:17 > constになっちまうのは困るんだろ?じゃあこうだ。

このへんちょっと原文と違いますね。
意訳ですが、原文だと

「多くのケースの解決策は、変数宣言を以下のように変更することですが

const char *foo = strchr("ciao", 'a');

これで解決できないケースもあるので、そういった場合はconst_castを使いましょう」

という意味になってると思います。

tmatsuutmatsuu 2009/07/20 16:19 ご指摘ありがとうございます。そのあたりから原文読まずに私感入りました。
全体を意訳してしまうか、できるだけ原文どおりにするか、どちらかに統一すべきでした。まだまだ私の文章力が足りないようです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tmatsuu/20090717/1247835994