パスワードを忘れた? アカウント作成
4813208 journal
プログラミング

ikuuyaの日記: The only constant is change 4

日記 by ikuuya

タイトルはBT,Emotional Technologyより
「唯一不変なことは、物事は変化する、ということ」が本当の訳だと思うんですが、日記の内容は「定数が変化するよ」という危げなお話。

Cの変数宣言で
const int foo=10;
と書くと、変数fooは10に固定され、書き換えが出来ません。
というのがお約束、なわけですが…

scanf("%d",&foo);
でキーボードからの数値入力を問題なく取り込めてしまうという事実…
(cygwin上のGCC4.3、他いくつかのシステムで確認)

K&R本を読むと、代入演算(つまり=)の左辺値として、const修飾子のついた変数が使えない、ということだけのようで…
色々調べてみると、強引にキャストすると書き換えが出来るよ、なんてのもありました。
強引なキャストでなくても、こんな基本的な構文?で書き換えが出来てしまうのは、どうかと。
(一応、-Wallオプションをつけると、warningこそ出るものの実行可能ファイルが出来るわけで)

使っちゃダメ、と言いたいところですが、書いた本人は「ちゃんと動いてるからいいや」という感じ。constをつける意味が分かってないようです。
#困ったなぁ…

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • たしかGCC/Cコンパイラは .rodata せくしょんにおく。
    リンカというか、リンキングローダ(ld)がどこに配置するかは、環境依存というか、specファイル依存。
    #ROM化用にビルドした場合は、.textセグメントにマージしたりする。
    #初期化ずみデータセグメントにおく場合もある
    で、置いたセグメントが書き換え可能かどうかは、
    ランタイムローダとOSに依存する。(ld.soなど)

    Cにおけるconstぞくせいがちゅうとはんぱなんですが。
    あと、scanfの第二引数以下はプロトタイプもないし。

    #ひょっとしてJAVAにある final宣言のつもりだったりして。、
    • 関数内のローカル変数だとconst付けても大抵スタック上に置かれるので、書き換え可能になってしまうことが珍しくないですね。

      親コメント
      • こーリングスタックとエバリュエーションスタック、環境フレームを分ける実装なら、なんとかなるか?
        #でも環境フレームに書き換え不能部分を作っても作成時は書き換え可能にしなきゃならないから複雑化するだけ。

        実際には分ける利点がなくなってるので、ひとつにしたほうがらくだからそうなっていますからね。
        #8-16ビット時代はコーリングスタックに割り当てる領域が小さいので別にとる場合もありました。
        親コメント
  • by Anonymous Coward on 2012年07月03日 21時46分 (#2186366)

    そもそもint* ptr = (void*)0; *ptr = 10; なんてやるだけで
    メモリ空間のどこにでもアクセスできる言語なんだし…。
    warningが出るだけでも素晴しすぎるじゃないか。

    # てか-Werrorを付ければ実行可能ファイルも出来ないよ!

typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...