パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Hello, Worldに潜むバグ」記事へのコメント

  • by Anonymous Coward

    ・C言語の高水準入出力 printf(3) とか fputs(3) で出力した内容はキャッシュされるので fclose(3) とか fflush(3) とかで吐き出して戻り値を確認しないと正常に出力されたことは保証されない。
    ・exit(3) なり main() からの return で暗黙にフラッシュした場合はエラーチェックできないので、失敗してもわからない。

    というのは基本仕様なので知っとく必要がある。
    /dev/full とかだけでなく、write(2)で発生するあらゆるエラーの可能性がある。

    • by Anonymous Coward

      これC言語にフォーカスしているからおかしい(のとC言語もバグ扱いにしているのがおかしい)。
      JavaとかNode.jsみたいに例外処理がある処理系でも発生しているのは確かに不思議。
      Javaは調べてみると、PrintStreamはIOExceptionを投げない [oracle.com]となっているから、そもそもそういう仕様なのね。
      # バグを仕様と言い張るのと逆で、仕様をバグと言い張っているのか

      • by Anonymous Coward

        Javaでもmainメソッドの外で暗黙に閉じられたstreamが仮に例外を投げるとしてもcatchのしようがないのでは?

        • by Anonymous Coward

          Javaも例外が拾われずに終了する場合は1(エラー)を返すので、問題はキャッシュしたstreamがflushされるタイミングですね。
          普通に考えて処理最後にはflushされるはずなので、仮にstreamが例外をthrowするならエラーで終わる気がします。
          C#はエラーになっているので、そのあたりは作りしだいですが。

          • by Anonymous Coward

            >普通に考えて処理最後にはflushされるはず
            これな、Streamクラスによっては仕様で担保されてなくて、まあほとんどはSun由来のJRE使うから問題ないんだけど、IBMの組み込み向けJ2MEでflushされないのをライブラリのソース読んで確認した。
            大昔の話。

            • by Anonymous Coward on 2022年03月25日 1時10分 (#4221058)

              PCみたいな富豪環境以外は終了処理をリソース食わずに素早く終わらせることを優先するのが普通だよ。Cまでいくと仕様上は振る舞いを説明するだけでなんの保証もなく、ただホストに投げると明記される程度だし。ioはホスト/プラットフォーム依存の塊だし。

              本当の問題は富豪環境でもRAIIやファイナライザのコールバックがioのcloseの際のエラーを握りつぶすしかないことだよ。きれいにやりたいなら手動でやるしかない。

              親コメント

犯人はmoriwaka -- Anonymous Coward

処理中...