アカウント名:
パスワード:
> どっかのお兄さんがfclose()はどのルートでも実行すればいい
あくまでfpがあるときは、漏れなくcloseしようですもんね。
# Cのポインタは、1.解放漏れ、2.2重解放(解放時の変数のNULL初期化漏れとかその判定漏れ) 3.NULLでのアクセス/クローズ の3つはチェックできてないとまずいってところかなあ...
free は NULL 渡してもいいので、つい fclose にも NULL を渡したくなってしまいますね。EVP_CIPHER_CTX_free の方は、簡単にググった感じでは NULL を渡して良さそうです。
んー、それはどうだろう?クローズのときにNULLが渡されるのって、異常系が実装されていない正しくないロジックだから、と考えれば、異常終了するのが望ましい。…と考えることもできるんじゃないかと。
どうしても、ってことなら、
fclose(fp);
を
fp && fclose(fp);
と書けば済む話だしね。
# Powershellのusing、なぜC#相当じゃないんだー!!
というと、free(NULL)とfclose(NULL)で差を設けている理由はなんでしょうかね・・・
不明としか言いようがないですね。
ただ、mallocに失敗して、NULLが返ってきて、そのエラー処理をしていなければ、freeするより前に異常終了しますよね。NULLチェックをしているなら、正常系にのみfreeを書けば済むし。
この書き方おもしろいですねw
Cだと割とよくある書き方だと思いますよ。こーゆーのを知らないと、例えば、
if(func1() || func2()) {
みたいなコードを書いたときに、func2が実行されない! みたいなことで悩むことになります。
なので、中級の教科書には載ってると思います。
あんまり見ない書き方ですねw
見たことが無いのは、個人の経験なので仕方ないですね。# 職業プログラマなら、草生やしてる場合じゃないと思いますが。
しかし、中級以上の教科書では必ず解説されているので、手元の教科書を読み返してみてください。もちろん、ぐぐってもいいです。いくらでも出てきます。
関数の戻り値評価は
関数でなくても、
flag && --i > 0
とかでも同じ問題が発生します。
また、
name = id || "Anonymous Coward";
とかもよく見る書き方です。
Cでなくても、JavaでもJavaScriptでもRubyでもPerlでも同じことができます。
業界柄、使用が禁止されているということですよw
それはよく理解できます。もっと緩いソフトウェア開発の現場でも、レベルの低いプログラマ(というか、コーダというか)が混じっている場合(残念ながらよくあることです)には、そーゆーコーディング規約を定めることはよくあります。つまり、レベルの低いメンバが理解していないだろうハマり所にハマらないように、最初から禁止しておく、ってことです。
言い換えれば、レベルの高い低いを決めるのは、その理由を知ってるか知らないかだ、ってことです。
fcloseやfreeもそうで、上から言われたからやってる、ってのじゃ、職業プログラマとしてはちょっと…となるわけです。どれも学生さんが使う教科書にも載ってるわけですし。
> name = id || "Anonymous Coward";これは、C と Java では動かないです。
ああ、確かにそうですね。ご指摘ありがとうございます。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
いつでもfclose (スコア:1)
> どっかのお兄さんがfclose()はどのルートでも実行すればいい
あくまでfpがあるときは、漏れなくcloseしようですもんね。
# Cのポインタは、1.解放漏れ、2.2重解放(解放時の変数のNULL初期化漏れとかその判定漏れ) 3.NULLでのアクセス/クローズ の3つはチェックできてないとまずいってところかなあ...
M-FalconSky (暑いか寒い)
Re:いつでもfclose (スコア:1)
解放対象がNULLかどうか、コールされたAPI側で判定して欲しいです。。。
Re:いつでもfclose (スコア:2)
free は NULL 渡してもいいので、つい fclose にも NULL を渡したくなってしまいますね。
EVP_CIPHER_CTX_free の方は、簡単にググった感じでは NULL を渡して良さそうです。
svn-init() {
svnadmin create .svnrepo
svn checkout file://$PWD/.svnrepo .
}
Re:いつでもfclose (スコア:1)
これですね。たぶん私にアドバイスしたお兄さんも、そのつもりで話をしたのでしょう。
Re:いつでもfclose (スコア:1)
んー、それはどうだろう?
クローズのときにNULLが渡されるのって、異常系が実装されていない正しくないロジックだから、と考えれば、異常終了するのが望ましい。
…と考えることもできるんじゃないかと。
どうしても、ってことなら、
を
と書けば済む話だしね。
# Powershellのusing、なぜC#相当じゃないんだー!!
Re:いつでもfclose (スコア:1)
というと、free(NULL)とfclose(NULL)で差を設けている理由はなんでしょうかね・・・
> fp && fclose(fp);
この書き方おもしろいですねw
ワンライナーで実行する・しないが選べるとは・・・
Re:いつでもfclose (スコア:1)
というと、free(NULL)とfclose(NULL)で差を設けている理由はなんでしょうかね・・・
不明としか言いようがないですね。
ただ、mallocに失敗して、NULLが返ってきて、そのエラー処理をしていなければ、freeするより前に異常終了しますよね。
NULLチェックをしているなら、正常系にのみfreeを書けば済むし。
この書き方おもしろいですねw
Cだと割とよくある書き方だと思いますよ。
こーゆーのを知らないと、例えば、
みたいなコードを書いたときに、func2が実行されない! みたいなことで悩むことになります。
なので、中級の教科書には載ってると思います。
Re:いつでもfclose (スコア:1)
あんまり見ない書き方ですねw
関数の戻り値評価は、おおよそ一関数実行の後にすぐやるので複数条件の並ぶ
if文はそうそう出てこないです。
また、gdbを使うことが多いので戻り値は一時変数に取ることが多いです。
Re:いつでもfclose (スコア:1)
あんまり見ない書き方ですねw
見たことが無いのは、個人の経験なので仕方ないですね。
# 職業プログラマなら、草生やしてる場合じゃないと思いますが。
しかし、中級以上の教科書では必ず解説されているので、手元の教科書を読み返してみてください。
もちろん、ぐぐってもいいです。いくらでも出てきます。
関数の戻り値評価は
関数でなくても、
とかでも同じ問題が発生します。
また、
とかもよく見る書き方です。
Cでなくても、JavaでもJavaScriptでもRubyでもPerlでも同じことができます。
Re:いつでもfclose (スコア:1)
以下のリンクの(5)の通りでございます。。。
http://www.softech.co.jp/mm_070801_firm.htm#rule12-4
ひとまずありがとうございました!
Re:いつでもfclose (スコア:1)
業界柄、使用が禁止されているということですよw
それはよく理解できます。
もっと緩いソフトウェア開発の現場でも、レベルの低いプログラマ(というか、コーダというか)が混じっている場合(残念ながらよくあることです)には、そーゆーコーディング規約を定めることはよくあります。
つまり、レベルの低いメンバが理解していないだろうハマり所にハマらないように、最初から禁止しておく、ってことです。
言い換えれば、レベルの高い低いを決めるのは、その理由を知ってるか知らないかだ、ってことです。
fcloseやfreeもそうで、上から言われたからやってる、ってのじゃ、職業プログラマとしてはちょっと…となるわけです。
どれも学生さんが使う教科書にも載ってるわけですし。
Re:いつでもfclose (スコア:1)
緩い現場の話でのルール適用なら、私もそうだと思いますw
コードレビューする側に十分なスキルがある現場は理想的ですね。
> どれも学生さんが使う教科書にも載ってるわけですし。
そうですね!
くれぐれも気をつけたいと思います。
Re:いつでもfclose (スコア:2)
> name = id || "Anonymous Coward";
これは、C と Java では動かないです。
svn-init() {
svnadmin create .svnrepo
svn checkout file://$PWD/.svnrepo .
}
Re:いつでもfclose (スコア:1)
ああ、確かにそうですね。
ご指摘ありがとうございます。