タグ

2014年2月20日のブックマーク (4件)

  • いやなブログ - RAII と setjmp/longjmp

    RAII と setjmp/longjmp C++ には RAII (Resource Acquisition Is Initialization) というイディオムがあります。これはリソースの開放を確実に行うためのテクニックとして C++ のプログラムで広く用いられています。しかし、RAII も setjmp/longjmp という落とし穴があります。 RAIIの基 次のプログラムはメモリリークを起こします。 #include <string> using namespace std; int main() { string *p = new string; return 0; } このプログラムをビルドして valgrind でテストすると次のようなエラーメッセージが表示されます。4バイトのメモリリークが検出されました。 % g++ test.cc % valgrind ./a.ou

    embedded
    embedded 2014/02/20
    C++「物凄い勢いで RAII と setjmp/longjmpの落とし穴にはまるプログラマのムービー」
  • MSC22-C. setjmp()、longjmp() の機能を安全に使用する

    MSC22-C. setjmp()、longjmp() の機能を安全に使用する setjmp() マクロは、[ISO/IEC 9899:1999] のセクション7.13.1.1 に列挙されている文脈からのみ呼び出すこと。それ以外の文脈から setjmp() を呼び出すと未定義の動作となる(未定義の動作 119 を参照)。 volatile 修飾型でないローカルオブジェクトの場合、値が setjmp() の呼び出し以降変更されていた場合、longjmp() の呼び出し後にそのオブジェクトにアクセスしてはならない。この場合、オブジェクトの値は不定と見なされ、アクセスすると未定義の動作が引き起こされる(未定義の動作 121、10 を参照)。 longjmp() 関数を使用して、実行がすでに終了している関数に制御を戻してはならない(未定義の動作 120 を参照)。 シグナルマスク、浮動小数点ステー

    MSC22-C. setjmp()、longjmp() の機能を安全に使用する
    embedded
    embedded 2014/02/20
    setjmpはif文の中で使うこと。戻り値をローカル変数に入れてはダメ。知らなかった。
  • C++ で longjmp() 関数を使ってはならない - masugata_kの日記

    longjmp() 関数を使うと C でも例外処理っぽいことができるわけだが、これは、間違っても C++ プログラム中では使ってはならない。まあ、C++ には物の例外処理があるので使うわけもないのだが、C との混合プログラミング*1の際などには注意を要する。 問題は、longjmp() の呼び出しによって消滅するスタック上のオブジェクトのデストラクタが呼ばれない、ということだ。例外送出に伴うスタック巻き戻しではスタック上のオブジェクトが解体されるが、longjmp() にはこれがない。いや、デストラクタが呼び出されないどころか、そもそもそういう事態での C++ プログラムの挙動は不定である: C++ 標準*2 ― 18.7 の 4 The function signature longjmp(jmp_buf jbuf, int val) has more restricted behav

    C++ で longjmp() 関数を使ってはならない - masugata_kの日記
    embedded
    embedded 2014/02/20
    「longjmp() の呼び出しの結果として消滅するスタックにデストラクタが呼び出されるようなオブジェクトがあったら、プログラムの動作がどうなるかは分からないよ」なんでC++の標準ヘッダに<csetjmp>があるんだろ。
  • Super Technique 講座~longjmpと例外

    プログラムの流れを制御する手段として、いわゆる「構造化構文(for とか if とか)」、悪名高い「goto 文」などがあるのは周知のことだが、かなり特殊なものとして、「setjmp, longjmp」による「非ローカル分岐」と呼ばれるものがある。この「非ローカル分岐」は「非ローカル」と言うだけあって、ある関数の中から、別な関数に制御を移すことができたりする。まあ、そのために乱用すべきではなく、注意して使わなくてはならないライブラリ関数なのだが、実はこれは JavaC++ で言語の上で実装されている「例外」の基礎となるものである。だから、まずこの標準ライブラリ関数「setjmp, longjmp」について解説しよう。 → Java 講座の「例外」 setjmp, longjmp とは どうやって実現してるの? setjmp/longjmp の利用例~インタプリタ 補追1:setjmp

    embedded
    embedded 2014/02/20
    setjmp/longjmpの話。