アカウント名:
パスワード:
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とかできるんだったら、もうちょっとすっきりしたコードになるね。
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 ポインター参照なのではなかろうか。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
身近な人の偉大さは半減する -- あるアレゲ人
エラー処理は? (スコア:1)
このfopenって、ANSIのやつじゃないよね?
引数が三つあるし、初期化されてもいないし、なんら実体を指していないfpを渡して、何か意味がある?
この後、「ファイルの内容を読み込む」のに、"wb"ってのも謎だし。
ANSI的には、
って書く場面だよね。
それに、これなら、fopenに失敗したときにfcloseすることはない。
初等教科書にも、こーゆーコードが載ってるんじゃないかな?
実用的なコードとしては、fopen できなかったときのエラー処理が無いのもおかしくね?
エラー処理で、returnとかexitとかできるんだったら、もうちょっとすっきりしたコードになるね。
Re:エラー処理は? (スコア:1)
書いてくれたANSI準拠のコードが正解です。
Re:エラー処理は? (スコア:2)
openssl の方のこのコードでは、二重解放以前に、test を初期化せずに暗号処理に使用してしまいます。
ちゃんと書くと、下の感じだと思いますが、手元の環境では test が NULL でもクラッシュしないですね。(Debian9, openssl 1.1.0)
// fpの方も、二重解放というより NULL ポインター参照なのではなかろうか。
svn-init() {
svnadmin create .svnrepo
svn checkout file://$PWD/.svnrepo .
}
Re:エラー処理は? (スコア:1)
ライブラリのバージョン的には同じ1.1系なんですが、クラッシュはしないけどSIGILLになりませんか?(GDB経由で実行すると出てくると思います)
私のところもDebian系のディストリなのですが、上記のコードを実行するだけでは正常終了してしまいます。