アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
ウイルス感染環境作んなボケェ! (スコア:-1, 荒らし)
メモリ破壊コード (スコア:1, 興味深い)
Re: (スコア:2, 参考になる)
別に何を再現する必要も無いのでは?
不定というのは、結果がどうなっても構わないという意味です。
暴走、例外はおろか、鼻から悪魔が飛び出しても言語規約上許されますし、
そんな分かりやすいリアクションではなく、一見正しく動作しているフリをしても構いません。
数多くのプログラマを苦しめてきた、Cの暗黒面の筆頭といって良い仕様です。
Re: (スコア:1, おもしろおかしい)
指定された壊れたメモリ領域を律儀に読み込んでとんでもない動作を実行し続けるだけで。
壊れていようがなんだろうがお構い無しに実行するのがCという言語の仕様。
まあコードからだけでは動作を予測し切る事は一般にできないもんだけど。
Re: (スコア:2, 参考になる)
なんかprintfをつけたら症状が出なくなったからデバッグ完了、と同じ類のvoodoo臭がぷんぷん漂ってきますよ。
Cの規格では確保したバッファの範囲外を読んだり書いたりアドレスを生成するだけで不定になります。
確保したバッファ+1のアドレス生成だけは認められていますが。
Re: (スコア:1, 興味深い)
アドレスを生成した時点で不定だったっけ?
void* pv = (void*)(0xDEADBEEF);
このコードが存在するだけで不定って意味になるけど、pvを使ってアクセスしなければ不定にはならないと思うよ。
Re: (スコア:2, 興味深い)
はポインタの指す先を読み書きしなければ大丈夫です。
整数はどんなポインタにも変換可能と規格で決まっています。
undefined なのは
char buf[1]; や char *buf = malloc ( 1 );
があったときに、(buf-2) や (buf+2) を含む式を評価した場合です。
例えば オーバーフローがあると例外を発生させるような種類の CPU で、
buf がメモリ空間の端っこ付近に割り当てられていたりすると
ひどい目にあうかもしれません。
一方 (buf-1) や (buf+1) は評価できることになってます。
一個までなら配列の範囲外を指すポインタを生成しても
オーバーフローしないと規格で決められています。
先の例で言うと、 buf はメモリ空間の端っこに配置されません。
必ず一要素分以上隙間があります。
Re:メモリ破壊コード (スコア:0)
struct buffer { int a,int b, ... } *pBuffer;
pBuffer = new malloc( sizeof(buffer)*MAX_ELEMENT );
pBuffer[-1]やpBuffer[MAX_ELEMENT]を許すには sizeof(buffer) bytes前後に
開けなきゃいけないってなるけど、ランタイムにとってはサイズをもらってるだけの
関係だから「んなもんわかんねーよ」なんじゃないかなー
Re: (スコア:0)
> 開けなきゃいけないってなるけど、
なりません。アドレスを生成することは合法ですが、そこにアクセスした瞬間未定義になります。つまり境界を踏み越えて隣の変数とかmallocの管理領域とかを破壊しても言語仕様上は一向にかまいませんし、実際多数の実装がそうなっています。pBuffer[-1]は別コメントにあるとおりそもそも未定義なので議論を省略。