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

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

  • by Ryo.F (3896) on 2017年12月02日 10時42分 (#3322147) 日記

    if( fopen( path, fp, "wb" ) ) {

    このfopenって、ANSIのやつじゃないよね?
    引数が三つあるし、初期化されてもいないし、なんら実体を指していないfpを渡して、何か意味がある?
    この後、「ファイルの内容を読み込む」のに、"wb"ってのも謎だし。

    ANSI的には、

    FILE *fp;
    if( fp = fopen( path, "rb" ) ) {
      /* ファイルの内容を読み込む */
      fclose( fp );
    }

    って書く場面だよね。

    それに、これなら、fopenに失敗したときにfcloseすることはない。
    初等教科書にも、こーゆーコードが載ってるんじゃないかな?

    実用的なコードとしては、fopen できなかったときのエラー処理が無いのもおかしくね?

    FILE *fp;
    if( !fp = fopen( path, "wb" ) ) {
      /* エラー処理 */
    } else {
      /* ファイルの内容を読み込む */
      fclose( fp );
    }

    エラー処理で、returnとかexitとかできるんだったら、もうちょっとすっきりしたコードになるね。

    • by delta-keeper (31927) on 2017年12月02日 17時59分 (#3322289) 日記
      あら、なんか色々書き間違えてましたw
      書いてくれたANSI準拠のコードが正解です。
      親コメント
      • by ktmizugaki (46208) on 2017年12月02日 22時20分 (#3322395) 日記

        openssl の方のこのコードでは、二重解放以前に、test を初期化せずに暗号処理に使用してしまいます。

        EVP_CIPHER_CTX *test;
        if( EVP_CIPHER_CTX_new ) {
                    /* 暗号処理 */
        }
        EVP_CIPHER_CTX_free( test );

        ちゃんと書くと、下の感じだと思いますが、手元の環境では test が NULL でもクラッシュしないですね。(Debian9, openssl 1.1.0)

        EVP_CIPHER_CTX *test;
        if( (test = EVP_CIPHER_CTX_new()) != NULL ) {
                    /* 暗号処理 */
        }
        EVP_CIPHER_CTX_free( test );

        // fpの方も、二重解放というより NULL ポインター参照なのではなかろうか。

        --
        svn-init() {
          svnadmin create .svnrepo
          svn checkout file://$PWD/.svnrepo .
        }
        親コメント
        • すいません・・・なんか疲れているようですw

          ライブラリのバージョン的には同じ1.1系なんですが、クラッシュはしないけどSIGILLになりませんか?(GDB経由で実行すると出てくると思います)

          私のところもDebian系のディストリなのですが、上記のコードを実行するだけでは正常終了してしまいます。
          親コメント

身近な人の偉大さは半減する -- あるアレゲ人

処理中...