The _Exit function causes normal program termination to occur and control to be returned to the host en vironment. No functions re gistered by the atexit function or signal handlers registered by the signal function are called. The status returned to the host en vironment is determined in the same w ay as for the exit function (7.20.4.3). Whether open streams with unwritten buffered data are flushed, open streams are closed, or tempo
何がバグなのかわからない (スコア:4, すばらしい洞察)
putsの実行結果戻り値をハンドリングせずにプログラムを常に正常終了するようなコードなんだから、putsが成功しようが失敗しようが正常終了するのが当たり前に思えるんですけど。
Re:何がバグなのかわからない (スコア:2)
全く同意
「エラー処理してるつもりが効いてない」ならわかるけどエラー処理してないんだからなぁ
エラーになるんならバグだけど
Re:何がバグなのかわからない (スコア:1)
> putsの実行結果戻り値をハンドリングせずに
知ったかぶってるけど、この場合 puts() の戻り値をチェックするだけでは不足なんだよ。
やってみればすぐわかるけど、標準的な環境でファイルへの puts() は (メモリが足りてる限り) 必ず成功する。
書き込みエラーの確認をしたい場合には上に書かれているように、その後で fflush() とか fclose() して、
その戻り値を確認する必要がある。
Re: (スコア:0)
そこは本質じゃないと思うのですが。
問題は「必ず正常終了するプログラムを実行したら必ず正常終了する。どこがバグ?」というところなので。
# ま、正確には「puts()が失敗した時にプログラムを異常終了する処理なしに」と書くべきでしたね。
Re: (スコア:0)
元コメとは別人だけど、
>> putsの実行結果戻り値をハンドリングせずに
こんな風に無駄に間違った詳細を書いてる以上、ツッコまれるのは当然で、「そこは本質じゃない」はゴマカシに見えるかな。
Re: (スコア:0)
> 正確には「puts()が失敗した時にプログラムを異常終了する処理なしに」と書くべきでしたね。
やっぱりわかってないよね?
今回の /dev/full にリダイレクトする条件では puts("Hello World") は失敗しないので、「puts() が失敗した時にプログラムが異常終了する処理」を記述したとしても違いはないよ。
Re: (スコア:0)
そもそもputsが成功しているかすらチェックしていない、すなわち必ず書き込まれることを期待していないのだから
書き込みに失敗していようが正常終了だろって意味では
Re: (スコア:0)
いや、だから、今回の例では puts() は、確実に成功するので戻り値を確認する意味なんて元々ない。
書き込まれたか確認したいなら、その後で fclose(stdout) して、その戻り値を確認するべき。(それで必要十分)。
Re: (スコア:0)
それがputs()が失敗したかチェックするという事ではないのですか?
Re: (スコア:0)
> 書き込まれたか確認したいなら
このプログラマはそんなこと望んでない。
putsが実際に文字列を出力したかしなかったかに関わらず、常に正常終了のコードを返すようにコーディングしている。
そして実際の動きもそうなっている。
何がバグなのってのが大元の主張でしょう。
Re: (スコア:0)
違います。
puts() はバッファキャッシュに書き込む関数。バッファーキャッシュに書き込めれば成功。(その後で条件/実装によっては自動でフラッシュするけど、必ずしもフラッシュするわけではない)
素人向けに言い直すと puts()は書き込みの予約をする関数で、実際に書き出すのは別ということ。「予約する関数」なんだから予約さえできれば成功。今回の例だと main() からの return が「予約を実行して終了」という命令になる。ここでかわりに _Exit() とすれば「予約を破棄して終了」という命令になる。
Re: (スコア:0)
ただの雑談でそんなめんどくせーことには触れずに丸めた会話してるってことだろ。
あと自信満々に書いてるけど、_Exitがバッファをフラッシュするかどうかは処理系定義だぞ。
破棄する保証なんてない。
Re: (スコア:0)
別人だけど(上で「別人」と書いたコメントとは同一人物)、
> 丸めた会話
丸めずに間違ってる詳細書いたからツッコまれてるだけでは。
(テストで、不必要に難しい漢字を使って誤字で減点されるのと似てる)
> あと自信満々に書いてるけど、_Exitがバッファをフラッシュするかどうかは処理系定義だぞ。
自信満々にウソ書く人よりはマシかな。
https://cpprefjp.github.io/reference/cstdlib/exit_.html [github.io]
>(_Exitの)効果
> :
>Cストリームのバッファはフラッシュされない。
Re: (スコア:0)
cの話にc++の話を持ち出してきて何が言いたいの?
cとc++は異なる規格だって知らないの?
Re: (スコア:0)
CとC++の区別すらつけられない人のために、ISO/IEC 9899:1999 から引用してあげよう。
The _Exit function causes normal program termination to occur and control to be
returned to the host en vironment. No functions re gistered by the atexit function or
signal handlers registered by the signal function are called. The status returned to the
host en vironment is determined in the same w ay as for the exit function (7.20.4.3).
Whether open streams with unwritten buffered data are flushed, open streams are closed,
or tempo
Re: (スコア:0)
putsのドキュメントにもエラーの場合EOFと書いてあってエラーになる可能性があるものをチェックすらしてないってことは、失敗していても正常終了とするのが仕様ってことですよ
Re: (スコア:0)
いしょうけんめい話をそらしてるの格好悪い。
/dev/full とかを前提にした話なんだから C規格で実装依存の部分は POSIX 規格参照しろ。C規格では実装依存みたいな話をするなら puts() がバッファリングするかどうかも I/O エラーが返ってくるかどうかも、正常終了が何を意味するかはもちろん標準出力が何を意味するかすらも全部環境依存だ。
「この Hello World の動作は環境依存」みたいなレベルの低い議論はしていない。
Re: (スコア:0)
そして、POSIX規格では「_Exit はCストリームをフラッシュしてはいけない」と規定されているらしい。
https://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html [opengroup.org]
> Open streams shall not be flushed.
Re: (スコア:0)
「俺の思う最強のhelloworldの仕様を満たしてないから、この実装はバグってる!」って主張してるだけだよな。
Bashはバグってないとか言ってるけど、Cの実装に寄せて
function helloworld {
echo "Hello World"
return 0
}
hwlloworld > /dev/full
ってやれば、終了ステータスは0になるだろうし。
Re: (スコア:0)
Hello Worldの仕様書とかあるのかな。
Re: (スコア:0)
K&R第2版には「Cでは,hello, worldと印字するためのプログラムは,次のようになる。」として書いてある。
ということは、書き込みが行われない場合はプログラムの目的は果たせてないのでエラーなのかな。
Re: (スコア:0)
K&Rでの記述は簡素な例示であって、完全なエラー処理や「どう書くべき」とかまではいちいち踏み込んでないからな。
プログラマの目的は果たせてないかもしれないが、プログラムからしたら「0を返せと言われているから0にしてるやろ。おたくの目的なんて知らんがな。わては書かれたとおりに実行してまっせ」となるだろう。
bashだってexit 0やreturn 0で抜けると終了ステータスは0だぞ。
~$ bash -c 'echo "Hello World";exit 0' > /dev/full; echo $?
bash: 0 行: echo: 書き込みエラー: デバイスに空き領域がありません
0
~$ function he