2007.07.21 ある gcc の warning の直し方 initialization discards qualifiers from pointer target type こんな警告を見たのでソースをみると, 一見問題無いように見える。 char *hoge[] = { "foo", "bar", "buzz" }; ググってみると, 頭ごなしに警告は無視しろと, 非常に役に立たな いものが見つかる:-(。英語ちゃんと読め? (^^; ごもっとも。読み 下すのが面倒だったんだもん:-)。 うにゃ〜と作業してるうちにあ る瞬間ふと気がついたのでメモを残しておく。 結論から言うとこれは「const char *hoge[]」と修正するのが正し い:-)。配列を意味する [] の扱いは問題無い({} でくくる)が, 要 は "foo" が char * でない(const char * である)のに気がつかな いのが問題なのである。 これを放置しておくと, 昔流行していた固定文字列(定数)への書き 込み問題(クラッシュを引き起こす)の引き金になりやすい。 -Wwrite-strings でチェックすることはもちろんだが, gcc に積極 的にチェックしてもらうためには, 十分なヒントが必要なわけで, やっぱり人間が注意しましょうということ。 なお, 「固定文字列書き込み問題」に対して (もっとも問題に気が つかないケースがほとんどかもしれないが), どうしても問題が解 決しないので(どっかでクラッシュする), とりあえず逃げておきた い場合は -fwritable-strings を使う手がある。 もっともさっきの hoge 配列の foo が XXX に書き換わることが期 待した動作かわかりません。まぁ大抵は想像もしてなかったできご とだとは思いますが。 固定文字列(定数)を期待しているところで別の値になってしまった ものがどういう副作用をもたらすかは不明:-)ですが, クラッシュ しなくなったら, しなくなったで, 謎の挙動で悩むことに変わらな いので, 早めの対処をしましょう。 まぁ藁をつかもうとしてる人, 喉元過ぎてしまった人には意味無い かもしれませんが。。。 Written by 重村法克