パスワードを忘れた? アカウント作成
この議論は、delta-keeper (31927)によって テキ禁止として作成されたが、今となっては 新たにコメントを付けることはできません。

ポインタ二重解放」記事へのコメント

  • > どっかのお兄さんがfclose()はどのルートでも実行すればいい

    あくまでfpがあるときは、漏れなくcloseしようですもんね。

    # Cのポインタは、1.解放漏れ、2.2重解放(解放時の変数のNULL初期化漏れとかその判定漏れ) 3.NULLでのアクセス/クローズ の3つはチェックできてないとまずいってところかなあ...

    --
    M-FalconSky (暑いか寒い)
    • その通りです。
      解放対象がNULLかどうか、コールされたAPI側で判定して欲しいです。。。
      • んー、それはどうだろう?
        クローズのときにNULLが渡されるのって、異常系が実装されていない正しくないロジックだから、と考えれば、異常終了するのが望ましい。
        …と考えることもできるんじゃないかと。

        どうしても、ってことなら、

        fclose(fp);

        fp && fclose(fp);

        と書けば済む話だしね。

        # Powershellのusing、なぜC#相当じゃないんだー!!

        • > クローズのときにNULLが渡される
          というと、free(NULL)とfclose(NULL)で差を設けている理由はなんでしょうかね・・・

          > fp && fclose(fp);
          この書き方おもしろいですねw
          ワンライナーで実行する・しないが選べるとは・・・
          • というと、free(NULL)とfclose(NULL)で差を設けている理由はなんでしょうかね・・・

            不明としか言いようがないですね。

            ただ、mallocに失敗して、NULLが返ってきて、そのエラー処理をしていなければ、freeするより前に異常終了しますよね。
            NULLチェックをしているなら、正常系にのみfreeを書けば済むし。

            この書き方おもしろいですねw

            Cだと割とよくある書き方だと思いますよ。
            こーゆーのを知らないと、例えば、

            if(func1() || func2()) {

            みたいなコードを書いたときに、func2が実行されない! みたいなことで悩むことになります。

            なので、中級の教科書には載ってると思います。

            • by delta-keeper (31927) on 2017年12月07日 2時53分 (#3324831) 日記
              > if(func1() || func2()) {

              あんまり見ない書き方ですねw
              関数の戻り値評価は、おおよそ一関数実行の後にすぐやるので複数条件の並ぶ
              if文はそうそう出てこないです。
              また、gdbを使うことが多いので戻り値は一時変数に取ることが多いです。
              親コメント
              • by Ryo.F (3896) on 2017年12月07日 8時46分 (#3324880) 日記

                あんまり見ない書き方ですねw

                見たことが無いのは、個人の経験なので仕方ないですね。
                # 職業プログラマなら、草生やしてる場合じゃないと思いますが。

                しかし、中級以上の教科書では必ず解説されているので、手元の教科書を読み返してみてください。
                もちろん、ぐぐってもいいです。いくらでも出てきます。

                関数の戻り値評価は

                関数でなくても、

                flag && --i > 0

                とかでも同じ問題が発生します。

                また、

                name = id || "Anonymous Coward";

                とかもよく見る書き方です。

                Cでなくても、JavaでもJavaScriptでもRubyでもPerlでも同じことができます。

                親コメント
              • by delta-keeper (31927) on 2017年12月07日 22時02分 (#3325532) 日記
                業界柄、使用が禁止されているということですよw
                以下のリンクの(5)の通りでございます。。。

                http://www.softech.co.jp/mm_070801_firm.htm#rule12-4

                ひとまずありがとうございました!
                親コメント
              • by Ryo.F (3896) on 2017年12月07日 23時40分 (#3325614) 日記

                業界柄、使用が禁止されているということですよw

                それはよく理解できます。
                もっと緩いソフトウェア開発の現場でも、レベルの低いプログラマ(というか、コーダというか)が混じっている場合(残念ながらよくあることです)には、そーゆーコーディング規約を定めることはよくあります。
                つまり、レベルの低いメンバが理解していないだろうハマり所にハマらないように、最初から禁止しておく、ってことです。

                言い換えれば、レベルの高い低いを決めるのは、その理由を知ってるか知らないかだ、ってことです。

                fcloseやfreeもそうで、上から言われたからやってる、ってのじゃ、職業プログラマとしてはちょっと…となるわけです。
                どれも学生さんが使う教科書にも載ってるわけですし。

                親コメント
              • by delta-keeper (31927) on 2017年12月08日 20時09分 (#3326172) 日記
                > 言い換えれば、レベルの高い低いを決めるのは、その理由を知ってるか知らないかだ、ってことです。
                緩い現場の話でのルール適用なら、私もそうだと思いますw
                コードレビューする側に十分なスキルがある現場は理想的ですね。

                > どれも学生さんが使う教科書にも載ってるわけですし。
                そうですね!
                くれぐれも気をつけたいと思います。
                親コメント
              • by ktmizugaki (46208) on 2017年12月08日 22時56分 (#3326251) 日記

                > name = id || "Anonymous Coward";
                これは、C と Java では動かないです。

                --
                svn-init() {
                  svnadmin create .svnrepo
                  svn checkout file://$PWD/.svnrepo .
                }
                親コメント
              • by Ryo.F (3896) on 2017年12月11日 8時13分 (#3327387) 日記

                ああ、確かにそうですね。
                ご指摘ありがとうございます。

                親コメント

ソースを見ろ -- ある4桁UID

処理中...