cに関するpi8027のブックマーク (14)

  • メモリ破壊の現場を見つけるTips - I am Cruby!

    RubyAdventJP, GC, Ruby(この記事はRuby Advent Calendar jp: 2009 : ATNDの4日目です。前日はmrknさんでした) 健全なるRubyistであれば、RubyのGCをいじることが週に一度はあるでしょう。そのときに困るのが、GCをいじってしまったことによるバグの修正です。GCをいじるというのは想像以上に難しく、少しでも書き間違えるとメモリ破壊が発生します。そのときに使えるTipsをこの記事で書くことにします。 みなさんご存じの通り、メモリ破壊というのは原因を特定するのが困難です。これは問題が発覚する場所とメモリ破壊が起こった現場が位置的に遠いことに起因しています。偉大なるハッカーのまつもとさんですら、その発見は困難です。 [ruby-dev:38628] Re: [BUG: trunk] called on terminated objec

    pi8027
    pi8027 2009/12/05
    これはべんり
  • GDBで歴史をさかのぼれるように!なりました! GDB 7.0 の新機能Reverse Debuggingを使ってみた - 日記を書く [・w・] はやみずさん

    Twitter上で、@alohakun が言及していた GDB の reverse debugging の機能を使ってみました。 GDB にトレースと逆実行機能入ったのか。 http://www.gnu.org/software/gdb/news/reversible.html http://twitter.com/alohakun/status/4481139191 まずは簡単な使い方を説明したあとに、インストール方法を説明します。 こんなときに便利 「変なこと」が起きている大体の場所がわかっているとき デバッグ中に、大体どこで変なことが起きているかはわかっているけど、細かい場所は特定できていないとき、reverse debuggingが効果を発揮します。 GDBでステップ実行をしていて、「しまった!行きすぎた!」という経験はよくあると思います。こういうとき、今まではプログラムの実行を最

    GDBで歴史をさかのぼれるように!なりました! GDB 7.0 の新機能Reverse Debuggingを使ってみた - 日記を書く [・w・] はやみずさん
    pi8027
    pi8027 2009/10/01
    すばらしい
  • mmapのAPI : kei@sodan

    まずはmmap()のAPIを説明します。 fd = open(file, access); a' = mmap(a, n, prot, share, fd, offset); まずは普通にファイルをopen()で開きます。その後、mmap()でマップします。 aは「この仮想メモリアドレスにマップしてほしい」という値を指定できるのですが、普通はNULLでOKです。nはファイルの何バイト目をマップするのか、offsetは何バイト目からをマップするのかという指定です。 shareという引数がありますが、これは複数のプロセスが同じファイルをmmapしたときの動作です。 shareにMAP_PRIVATEを指定すると、そのプロセスは別のコピーを見て、プロセス間でデータは共有されません。メモリ上に複数データがある…ということで、ディスクにはどのデータを書いていいのか分からないので、書き込み結果はファイ

    pi8027
    pi8027 2009/09/27
    mmap の話
  • http://www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf

  • はじめてのにき(2009-08-23)

    _ extension には先生が使ってくれたおかげで問題点が色々わかったりわかんなかったり。 タブ移動が欲しいわけだけどこれは background 側で eval する仕組みが必要。これは作った。 chrome:// やら chrome-extension:// で extension が生きないのはひどい。 chrome-extension で view-source すると死ぬのはひどい。 UI がギャグのようにヒドい 設定がいじれないから switch proxy が作れない hah は大変そうだなー caret browsing って webkit 側でコードは見た気がするよねえ とりあえず localStorage に移行しないとかなぁ。 あと TODO として x509 のエラーがあるんだけど、 これ 64bit debian sid でしか起きてないな… (04:19)

  • 文字列の繰り返し - hogelogの日記

    rubyのソースコードを眺めていたらrb_str_timesの実装がおもしろかったので、実際そういった書き方をすることでどれだけパフォーマンスに差が出てくるのか試してみました。 http://codepad.org/AQbS4Ilu #include <stdio.h> #include <stdlib.h> #include <string.h> inline unsigned long long rdtsc() { unsigned long long ret; __asm__ volatile ("rdtsc" : "=A" (ret)); return ret; } char *times_simple(char *str, size_t times) { size_t i, len = strlen(str); char *str2 = malloc(len*times + 1)

    文字列の繰り返し - hogelogの日記
    pi8027
    pi8027 2009/08/22
    関数呼び出しの回数の削減とコピーする単位のサイズの違い。memcpy の実装などを読むと良い。
  • Extensions to the C Language Family

    pi8027
    pi8027 2009/07/31
    C言語向けのGCC拡張のマニュアル。
  • 関数ポインタを返す関数 - 素人がプログラミングを勉強していたブログ

    [09/04/21 23:17:19] qnighy/Acike: C言語で [09/04/21 23:17:31] qnighy/Acike: 関数ポインタを返す関数って [09/04/21 23:17:40] qnighy/Acike: どうやって宣言すればいいのかわからない [09/04/21 23:18:23] daiki chijiwa: っvoid * [09/04/21 23:18:38] qnighy/Acike: とりあえず、typedefとかvoid*とかはなしで [09/04/21 23:19:18] qnighy/Acike: 関数ポインタの型宣言を関数の戻り値にたいして行う書き方をしりたい [09/04/21 23:21:49] 糸柳: typedef 無しでできるのかな[09/04/21 23:29:22] つっくん(javascripter):int f()

    関数ポインタを返す関数 - 素人がプログラミングを勉強していたブログ
  • #if 0ハックすごくね?すげーってw - Seasons.NET

    #If 0ってC,C++では、#endifまで問答無用でコメントにしますが、 これを使ったハックがすごく便利。 元ネタ http://gpwiki.org/index.php/SDL:Tutorial:Using_SDL_net #if 0 #!/bin/sh gcc -o a a.c exit #endif int main( void ) { printf( "Hello\n"); return 1; } これを保存して、実行属性をつけてから(chmod 755とか) ターミナルで、 # ./a.c と打ち込むと、 aという実行ファイルが生成される。 んで、./aと打ち込むと Helloと表示される。 今までは、Makefileか直接、gcc -o a a.cとかやっていた作業が、 ソースコード+Makefileの代わりになるわけ。 なぜこんな事ができるかってーと、 shのシェルスクリ

    #if 0ハックすごくね?すげーってw - Seasons.NET
  • 更新履歴兼雑記 cmpxchg を GCC 拡張で

    http://0xcc.net/blog/archives/000128.html を見て、なんかこの手の命令はたいてい GCC 拡張にあるんだよなーとか思ってたらありました。 __sync_bool_compare_and_swap と __sync_val_compare_and_swap 。 #include <stdio.h> void once(void) { // int は atomic な読み書きが可能 static volatile int entered; // 最初は 0 int result; result = __sync_val_compare_and_swap(&entered, 0, 1); // cmpxchg になる if (result == 1) { // すでに入ったことがある場合は return; // すぐ出る } // 初回の場合のみ、何かを

    更新履歴兼雑記 cmpxchg を GCC 拡張で
  • memologue - C/C++の定数の型の話, C90/C99の差分のびみょーな話

    Cのソースコードに m = 195; とか n = 0xffffffff; とか書いたときの定数(右辺)の型って、なんであるかご存じでしょうか? また、C90(1990年版のISO C言語規格)とC99(1999年版のそれ)ではその型が微妙に異なったりすることがあるんですが、ご存じでしょうか? さらには、お使いのマシンがILP32であるかLP64であるかLLP64であるかによっても、微妙に型が違ってきたりするんですが、それについてはどうでしょうか? えーもちろん、普段は「Uがついてなかったらint, Uがついてたらunsigned intジャネーノ?」くらいの理解でも殆ど不自由しないわけですが、詳細な理解がないとハマるケースも稀にあります。 私はというと、上に書いたような事は、C90/99の差違を除いてはだいたい理解しているつもりだったのですが、C90/99の差異について無頓着だったがため

    memologue - C/C++の定数の型の話, C90/C99の差分のびみょーな話
  • 日本規格協会 JSA Group Webdesk

  • ありがちなC言語プログラムの間違い

    ここでは、C言語によるプログラミングでありがちな間違いを紹介します。 C言語によるプログラミングで犯しやすい間違いは、 C言語 FAQ 日語訳 や C言語のよくある間違い に数多くの例が紹介されていますので、一度、目を通してみることをお勧めします。 ここでは、これらのページに見当たらなかった間違いの例を紹介します。 なお、C言語だけでなく、基的にC++言語でも同じことが言えます。

  • コンピューター:C言語講座:fork,exec,pipeについて

    コンピューター:C言語講座:fork,exec,pipeについて このテーマはどちらかというとUNIX系の話題になってしまうのですが、PC系ではDOSの時代にはマルチタスクができませんでしたので、平行には走れませんでしたが、C言語の処理系独自の関数がたくさんありました。WindowsになってからはUNIX系と似てきましたが、まだ少し違うようです。 自分で作成したプログラムから他のコマンドを実行したい、ということは良くあることだと思います。例えば、ディレクトリーの中身を簡単に得たい場合などはUNIXではlsコマンドを実行させて、結果をもらうのが簡単に思い付くと思います。とくにUNIXのコマンドはそのように組み合わせて使いやすくできていて、必要な情報だけを明確に返答するコマンドがほとんどです(その分、初心者が自分でコマンドを使う時に不親切なのですが)。 system() 大抵の人が上記のような

  • 1