新城@筑波大学情報です。こんにちは。

ふと思ったのですけど、コンパイラの規格って、コンパイラを作る
人が読むもので、コンパイラを作る人が読むものではないんじゃな
いかなあ。

In article <040121091727.M0114771@flame.hirata.nuee.nagoya-u.ac.jp>
        takao@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名古屋大学 です.
>> 最初の問題にもどします。文字列リテラルによる初期化という話で
>> はなくて、単に初期化していない要素をアクセスした時に、
>> segmentation fault か bus error が起きるかどうかです。
> 一応規格上は
> 6.7.8 Initialization, paragraph 10:
> If an object that has automatic storage duration is not
> initialized explicitly, its value is indeterminate.

「値が決定できない」ということは、「segmentation fault」は起
きなくて、なにか値は返ってくるという意味では。

> trap representation については 6.2.6.1 General, paragraph 5:
> Certain object representations need not represent a value of the
> object type. If the stored value of an object has such a
> representation and is read by an lvalue expression that does not
> have character type, the behavior is undefined. If such a
> representation is produced by a side effect that modifies all or
> any part of the object by an lvalue expression that does not have
> character type, the behavior is undefined. Such a representation
> is called a trap representation.
> 
> 配列要素に限らないんですが, 初期化しない自動変数の値を参照という
> のは, 規格上は「何が起きても知らない」ってことになりますかね.

a trap representation か。これは、「segmentation fault」とい
う意味なんですか。

>> > 規格を調べていただければよいのですが....
>> 規格には、興味は、あまりないので。興味があるのは、よいプログ
>> ラムを書くことや、よいデバッグの方法です。
> 「よいプログラム」とはどういう意味でしょうか? その意味によっては
> 規格が重要になりえると思います.

よいプログラムとは、一番は、人間が読んで分かりやすいプログラ
ムかなあ。それから、ちゃんと動く(よいプログラムでも動かない
のも場合によっては許す)。次は効率がよい(よいプログラムでも
効率が悪くても場合によっては許す)。

もちろん、規格で、「分け分からないことになる」と書いてあるよ
うな動作を使うプログラムは、人間が読んでも分けわからないので、
だいたい悪いプログラムというのは、その通りです。だけど、「規
格だからどうの」というよう因果関係で言われると引っ掛かる。

規格で、「分け分からないことになる」と書いてあるのは、どちら
かというと、コンパイラを作る人に対して「そこまではコンパイラ
で面倒みなくてもいいよ」と言っているんじゃないですか。

In article <040121091727.M0114771@flame.hirata.nuee.nagoya-u.ac.jp>
        takao@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
>> この規格は、ひどいね。char a[10] ならか可愛いけど、char
>> a[10000] = "abc" とかなると、想像したくない。去年は、配列の
>> 代入の話をしていたわけなので、それがOKならこれもOKにしな
>> いといけないんだろうけど。
> この「ひどい」というのは, 「初期化子がなければどんな値になってい
> るかわからないけど, 初期化子があれば必ず 0 になる」のがひどいって
> 意味ですね?

いいえ。遅いプログラムが簡単に書けるという所がひどい。たとえ
ば、次の似たようなプログラムがあったします。

f1()
{
    char a[10000] = "abc" ;
        ...
}
f2()
{
    char a[10000];
        strlcpy( a,"abc",sizeof(a) );
        ...
}

一見、上の方が関数呼出しない分速そうだけど、たぶん下の方が速
いでしょう。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\