並び順

ブックマーク数

期間指定

  • から
  • まで

1 - 11 件 / 11件

新着順 人気順

setjmpの検索結果1 - 11 件 / 11件

  • いやなブログ - 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

    • Exceptions in C with Longjmp and Setjmp

      This document describes a very simple implementation (with many limitations) of a system to add exceptions on top of C using the libc calls longjump and setjump. This system does not pretend to be really useful in practice but it is a useful lesson about longjump and setjump with a fun example. Introduction Exception are a very powerful way to program error safe programs. Exceptions let you write

      • setjmp/longjmpとローカル変数 - sumiiのブログ

        call/ccが出てきたので、ついでに: #include <setjmp.h> int main() { int x, y; jmp_buf k; x = 123; y = setjmp(k); if (y == 0) { x = 45; longjmp(k, 1); } return x + y; } はいくつを返すか、という話。 > gcc jmp.c -o jmp > ./jmp > echo $status 46 > gcc -O3 jmp.c -o jmp > ./jmp > echo $status 124xにvolatileをつけ忘れると、こういうこと↑になります… Cf. > (let ((x 123)) (let ((y (call-with-current-continuation (lambda (k) (set! x 45) (k 1))))) (+ x y)))

          setjmp/longjmpとローカル変数 - sumiiのブログ
        • 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() の機能を安全に使用する
          • setjmp用の__jmpbuf の スタックポインタがエンコードされている件 - higepon blog

            継続ライブラリを書くのに、setjmp を使えば(ある程度)可搬性が維持できると思い実験していたら見事にはまった。 setjmp が使う jmp_buf にはスタックポインタやら汎用レジスタが保存されていて、それらを書き換えて longjmp してあげれば好きな状態に復帰できる。(当然 jmp_buf はアーキテクチャ毎に構造が違う) jmp_buf に保存されている esp / eip が自分で取得したものと違っていてはまりまくった。 jmpbuf[0].__jmpbuf[3] // ebp jmpbuf[0].__jmpbuf[4] // esp jmpbuf[0].__jmpbuf[5] // eip のように取り出せるはずなのだけど saved ebp = bfd0c6a8 saved esp = 40dac680 // 本当の値は bfd0c680 saved eip = f70

              setjmp用の__jmpbuf の スタックポインタがエンコードされている件 - higepon blog
            • ホワット・ア・ワンダフル・ワールド Effective assembly language : 退避しなければならないレジスタを知りたい時は setjmp のソースを読もう.

              kosaki さんからコメントをいただきました. >> 壊しちゃいけないのが ebx, esi, edi, ebpとセグメントレジスタ ちなみに、壊しちゃいけないレジスタを調べるいちばんいい方法はsetjmpのソースを読むこと。 CPUによらず、こわしちゃいけないレジスタは保存してくれよるので、不慣れなCPUの時は参考になりますえ なるほど.というわけで,さっそく glibc-2.4 のソースを落としてきて,とりあえず glibc-2.4\sysdeps\i386\setjmp.S を開いてみた. /* Save registers. */ movl %ebx, (JB_BX*4)(%eax) movl %esi, (JB_SI*4)(%eax) movl %edi, (JB_DI*4)(%eax) /* スタックポインタ保存 */ leal JMPBUF(%esp), %ecx /* S

              • いにしえのsetjmp()とlongjmp()、あるいはCの例外とは - Qiita

                /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * William Jolitz. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * no

                  いにしえのsetjmp()とlongjmp()、あるいはCの例外とは - Qiita
                • リリカル☆Lisp開発日記 » Blog Archive » setjmpとlongjmpでユーザレベルスレッドを作る

                  「C言語のsetjmpとlongjmpがあればスレッドは作れる」 という話を聞いたので実際にやってみました。 まずは、完成品の使用例から。 #include <stdio.h> #include <stdlib.h> #include "ahothread.h" void f1(void *args) { int i, j; char *str = (char*)args; for (i=0; i<3; i++) { puts(str); for (j=0; j<10000000; j+= 1 + rand()%2); } } int main(int argc, char **argv) { int t1, t2; ahothread_init(); t1 = ahothread_create(f1, "aho"); t2 = ahothread_create(f1, "baka");

                  • use _setjmp/_longjmp on OS X by kazuho · Pull Request #3068 · mruby/mruby

                    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert

                      use _setjmp/_longjmp on OS X by kazuho · Pull Request #3068 · mruby/mruby
                    • Man page of SETJMP

                      Section: Linux Programmer's Manual (3) Updated: 2014-01-07 Index JM Home Page roff page 名前 setjmp, sigsetjmp - 非局所的なジャンプのために、スタックコンテキスト (stack context) を保存する 書式 #include <setjmp.h> int setjmp(jmp_buf env); int sigsetjmp(sigjmp_buf env, int savesigs); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): setjmp(): 「注意」参照。 sigsetjmp(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_C_SOURCE 説明 setjmp()

                      • ホワット・ア・ワンダフル・ワールド C 言語での setjmp/longjmp を用いた例外処理について

                        Java などに慣れ親しんだ後に,C 言語を使わざるを得なくなった場合,例外処理に悩むことってありますよね. 「C 言語での例外処理ってどうやんの ? え, 今時 goto ? C 言語使えねー」 ありがちありがち(笑) 人によって千差万別になってしまう -1 などの異常値を返すやり方はコーディング規則などが面倒ですし,大域ジャンプに goto を使うことは,人によっては狂信的に嫌うものです. もっとスマートにいかないものか… と日々悩んでいる人も多いはず. 最近,scheme の継続について調べているうちに, setjmp/longjmp というC言語標準関数の存在を知りました.これを使うと,Java ライクに例外処理が書けるみたいです. 何かの参考になればと(もしかして,常識なのかもしれませんが… あまり C 言語って使わないもので). ただ,longjmp は原始的な機能なので,うか

                        1