アカウント名:
パスワード:
> ファイルを読むだけで鼻から悪魔が出る可能性があるのか…
ここの原文は以下のようになっていて undefined behavior (鼻から悪魔) というわけではなくデータの内容が未定義というだけです:
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileap... [microsoft.com]> the contents of the file between the old end of the file and the new end of the file are not defined
あと、このデータ内容が未定義という仕様は Windows 95 の実装を考慮した記述になっているせいでWindows NT 系なら seek して飛ばして書いたところはゼロクリアされることが保証されているとか:
https://twitter.com/shirouzu/status/1125975975735377920 [twitter.com]> MSの生き字引、レイモンド・チェンによると(ACLなどない)Win95ではSetEndOfFileでゼロクリアしていなかったらしい。> ドキュメントに保証する記述が無いのは、そのためと。> https://devblogs.microsoft.com/oldnewthing/?p=45171 [microsoft.com]
https://twitter.com/shirouzu/status/1125977301831671808 [twitter.com]> それに関して「(ファイルシステム部が)NT系なら拡張部分を0と仮定してよい」と書いてあった。
そのセクターに書かれていた古いデータが読めたりするとセキュリティ的な問題が生じるわけで、モダンなOSであれば 0 フィルされていることを期待しても大丈夫な筈です。
悪魔が出ることはないが、仕様上何が入ってるか保証されない、という意味で本当にわからない。ゼロ埋めするかもしれないし、しないかもしれないし、てきとーなビット列で埋まってるかもしれない。だから例えばセクタ上の古いデータを読み出す目的に使えるかというと、そういうことにも使えない。ゼロ埋めされて「いない」データを期待することもできない。昔、巨大なダミーファイルを作る必要があって(Windows2000時代で、まだfsutilコマンドは無かった)、調べてSetEndOfFileの仕様を知ったとき、「へ〜、一体どんなデータが読めるんだろう?」とワクワクしながら叩いてみたら、きっかり全ゼロで埋められててガッカリした。
悪魔がデジタルデータに変化して潜んでいても上書きされないかもしれないんだから、出てくる可能性はあるんじゃないの?
まあ未定義と不定の違いは置いといて、mallocからの類推から当然に既定では内容は不定だと思ってた。記事書いた人的には「最大限の恐怖」らしいんだけど、しがないアプリ書きには全然ピンと来ない話だ。// 未定義と不定の違いを言ってるのかと思ったけど、そこらへんは問題にしてないようだし。
正直自分もどこが最大限の恐怖なのか分からんかった。スパースファイル使ってるならともかく、そうじゃないならゼロクリアはコストかかるんだからクリアしない方が自然だよな…。
スパースファイル使うなら何もせずともゼロクリアされるってのはスパースファイル側の挙動がファイルサイズ拡張に漏れて来てるだけで、ファイルサイズ拡張時の仕様としてゼロクリアするのとはまた違う気が…
仮にスパースファイル作れない状況でファイルサイズ拡張が行われた場合、ファイルサイズ拡張APIの仕様としてゼロクリアが明示されてないならゼロクリアは期待すべきじゃないと思う。
以前消したはずの秘密鍵が見えたりとか…
「不定」と「未定義」って同じようなものとは思わないがそんなにかけ離れてはいない気がするけど
未定義は不定を含むより広範な概念と解釈してもいいだろうし、不定は結果の一部(値など)が未定義であると解釈してもいいと思う。
含んでいるのだからかけ離れはしないだろうね。
実際鼻悪魔なコードでも結果の値が変(不定)なだけってケースは多い。
そういや、たしかJavaの旧IO系(java.io)APIもこのWindowsの仕様に準じてファイルポインタの移動で拡張した領域の内容は未定義とかってなってたはず……
もっともファイルポインタの移動でファイル領域を拡張できる全てのAPIにこの注意書きが書いてあるわけではないとかいうアレげな事になってるので……
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie
元の EOF の位置と新しい位置の間にあるファイルの内容は未定義です。 (スコア:0)
ファイルの内容は不定です、ならまあゴミデータか何か訳わからんけど何がしかのバイト列が読み出されてくるんだろうな、と期待できるけど、未定義ですとか言われちゃうと本当に悪魔から核ミサイルまで何でも出てくる可能性があるってことになるが。
Re:元の EOF の位置と新しい位置の間にあるファイルの内容は未定義です。 (スコア:2, 参考になる)
> ファイルを読むだけで鼻から悪魔が出る可能性があるのか…
ここの原文は以下のようになっていて undefined behavior (鼻から悪魔) というわけではなく
データの内容が未定義というだけです:
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileap... [microsoft.com]
> the contents of the file between the old end of the file and the new end of the file are not defined
あと、このデータ内容が未定義という仕様は Windows 95 の実装を考慮した記述になっているせいで
Windows NT 系なら seek して飛ばして書いたところはゼロクリアされることが保証されているとか:
https://twitter.com/shirouzu/status/1125975975735377920 [twitter.com]
> MSの生き字引、レイモンド・チェンによると(ACLなどない)Win95ではSetEndOfFileでゼロクリアしていなかったらしい。
> ドキュメントに保証する記述が無いのは、そのためと。
> https://devblogs.microsoft.com/oldnewthing/?p=45171 [microsoft.com]
https://twitter.com/shirouzu/status/1125977301831671808 [twitter.com]
> それに関して「(ファイルシステム部が)NT系なら拡張部分を0と仮定してよい」と書いてあった。
そのセクターに書かれていた古いデータが読めたりするとセキュリティ的な問題が生じるわけで、
モダンなOSであれば 0 フィルされていることを期待しても大丈夫な筈です。
Re:元の EOF の位置と新しい位置の間にあるファイルの内容は未定義です。 (スコア:1)
悪魔が出ることはないが、仕様上何が入ってるか保証されない、という意味で本当にわからない。
ゼロ埋めするかもしれないし、しないかもしれないし、てきとーなビット列で埋まってるかもしれない。
だから例えばセクタ上の古いデータを読み出す目的に使えるかというと、そういうことにも使えない。
ゼロ埋めされて「いない」データを期待することもできない。
昔、巨大なダミーファイルを作る必要があって(Windows2000時代で、まだfsutilコマンドは無かった)、調べてSetEndOfFileの仕様を知ったとき、「へ〜、一体どんなデータが読めるんだろう?」とワクワクしながら叩いてみたら、きっかり全ゼロで埋められててガッカリした。
Re: (スコア:0)
悪魔がデジタルデータに変化して潜んでいても上書きされないかもしれないんだから、出てくる可能性はあるんじゃないの?
Re: (スコア:0)
まあ未定義と不定の違いは置いといて、mallocからの類推から当然に既定では内容は不定だと思ってた。
記事書いた人的には「最大限の恐怖」らしいんだけど、しがないアプリ書きには全然ピンと来ない話だ。
// 未定義と不定の違いを言ってるのかと思ったけど、そこらへんは問題にしてないようだし。
Re: (スコア:0)
正直自分もどこが最大限の恐怖なのか分からんかった。
スパースファイル使ってるならともかく、そうじゃないならゼロクリアはコストかかるんだからクリアしない方が自然だよな…。
Re:元の EOF の位置と新しい位置の間にあるファイルの内容は未定義です。 (スコア:1)
ゼロクリアにコストはかからないのでクリアする方が自然だから
Re: (スコア:0)
スパースファイル使うなら何もせずともゼロクリアされるってのは
スパースファイル側の挙動がファイルサイズ拡張に漏れて来てるだけで、
ファイルサイズ拡張時の仕様としてゼロクリアするのとはまた違う気が…
仮にスパースファイル作れない状況でファイルサイズ拡張が行われた場合、
ファイルサイズ拡張APIの仕様としてゼロクリアが明示されてないならゼロクリアは期待すべきじゃないと思う。
Re: (スコア:0)
以前消したはずの秘密鍵が見えたりとか…
Re: (スコア:0)
「不定」と「未定義」って同じようなものとは思わないがそんなにかけ離れてはいない気がするけど
Re: (スコア:0)
未定義は不定を含むより広範な概念と解釈してもいいだろうし、
不定は結果の一部(値など)が未定義であると解釈してもいいと思う。
含んでいるのだからかけ離れはしないだろうね。
実際鼻悪魔なコードでも結果の値が変(不定)なだけってケースは多い。
Re: (スコア:0)
そういや、たしかJavaの旧IO系(java.io)APIもこのWindowsの仕様に準じてファイルポインタの移動で拡張した領域の内容は未定義とかってなってたはず……
もっともファイルポインタの移動でファイル領域を拡張できる全てのAPIにこの注意書きが書いてあるわけではないとかいうアレげな事になってるので……