憂鬱な午後のひととき


7月28日_
明け方3~4時頃の集中豪雨の凄まじさはなかった. 雨漏りするんじゃないかと思ったぐらい.
7月22日_
・天気悪くて日食見られなかったなあ. 残念. 悪石島に行った人もお気の毒でした.
Linuxカーネル2.6.30にルート・エクスプロイト
構造体のポインタチェックの前にそのメンバにアクセスしてる. それはgccの最適化のバグじゃなくて単にコードのバグだと思う. 実際VCでも同様の最適化は行われるようだ.
#include <stdio.h>

struct A {
    int *a;
    int *b;
};

int func(A *p)
{
    int *a = p->a;
    printf("a=%d\n", *a);
    if (p) {
        return 1;
    } else {
        return 0;
    }
}
    mov     eax, DWORD PTR _p$[esp-4] ; eax = p
    mov     ecx, DWORD PTR [eax]      ; ecx = p->a
    mov     edx, DWORD PTR [ecx]      ; edx = *(p->a)
    push    edx
    push    OFFSET $SG3842
    call    DWORD PTR __imp__printf
    add     esp, 8
    mov     eax, 1                    ; 常に1
    ret     0
-fno-delete-null-pointer-checks使えなんて場当たり的な対処じゃなくてvalgrindなり(kernelだと難しいけど), 静的解析ツール使ってそういうバグつぶすべき.
7月19日_
府中郷土の森博物館に無人小惑星探査機「はやぶさ」のドキュメンタリーを見に行った. あまりよく知らなかったのだけど通信が途絶えてから復活するシーンとかえらい感動した. 昔ボイジャー1号, 2号に興奮したくちの人はぜひ見るべし.
7月16日_
「ロボカップ2009グラーツ世界大会」ロボカップジュニア
優勝は小学4年生. 自分で設計して作るのか. 凄いなあ. 自分自身が制作者であることを示さないといかんかったというのがなんとも. プレゼンシートのプログラムの工夫ではお金を使って2進数の勉強か.
7月15日_
直木賞
時と人三部作や『ひとがた流し』でなくてベッキーさんとはなんだかな. 前作ならまだしも, あの最終巻ってのはどうかと思う.
7月14日_
『坊っちゃん』(夏目漱石)
なんとなく読んでみたが, 全然面白くなかった. 田舎に飛ばされて八つ当たりしてる短気で手の早い浅はかな主人公に共感できない. 小学生のときは面白がってたという記憶はあるんやけど. 意外だ. ところで生徒にからかわれるところとか, 下宿してるとかって, 『鹿男あをによし』(万城目学)はこれを念頭に置いてたのかな. 堀田さんも出てくるし(もちろん話は全然違う). もっぺん読んだら何か気が付くかも.
7月13日_
eval厨
へぇ, shinhさんはeva厨だったのかとしばし勘違いした.
パズルの国のアリス 死刑囚の生き残り戦略
これは面白かった. 一見不可能に思える問題の意外性, シンプルだけど巧妙な回答など, 近年見たパズルの中では1, 2位を争う.
7月12日_
あるプロセスでひたすら追記しているファイルを別プロセスで読み続ける(tail -f的)プログラムはVCだと
    for (;;) {
        std::string line;
        if (std::getline(ifs, line)) {
            std::cout << line;
            if (!ifs.eof()) {
                std::cout << std::endl;
            }
            continue;
        }
        ifs.clear();
        Sleep(1 * 1000);
    }
という感じで簡単に作れるのだけどLinuxでは一度eofに達するとclearしても駄目みたいだ. めんどいなあ.
7月7日_
朝, 太陽が出てたのに駅までのわずか百メートルちょいの間に物凄い雨が降ってずぶ濡れ. ああいうのもきつねの嫁入りというのだろうか. どちらかというと狸にばかされた感じだが. その後は晴れで満月(今年最小らしい)やね.
7月1日_
valgrindでvalgrind-test.cppみたいなソースをチェックすると
==13661== Syscall param write(buf) points to uninitialised byte(s)
==13661==    at 0x41FB194: write (in /lib/libc-*.so)
==13661==    by 0x41A2297: new_do_write (in /lib/libc-*.so)
(snip)
==13661==    by 0x4164A73: exit (in /lib/libc-*.so)
==13661==    by 0x4152174: (below main) (in /lib/libc-*.so)
==13661==  Address 0x401f000 is not stack'd, malloc'd or (recently) free'd
とかなってputchar(sum(buf))付近ばかり探していた(もちろん本当はもっと複雑だったけど)ら実は原因はずっと遠かった. valgrindは未初期化メモリの演算は未初期化として伝搬するけど演算だけでは警告を出さないようだ. 結構苦労して特定されたが実はvalgrind 3.4.0から--track-origins=yesというオプションが増えていた.
==13719==  Address 0x401f000 is not stack'd, malloc'd or (recently) free'd
==13719==  Uninitialised value was created by a stack allocation
==13719==    at 0x8048485: main (t.cpp:20)
と出るやん. やられた. ところで未初期化と言ってもたとえば
int main()
{
    int a;
    a ^= a;
    putchar(a);
}
みたいなのはaが正しく0になってると理解して警告を出さない. xor eax, eaxで0初期化は常套手段なので「未初期化の演算結果は必ず未初期化」だと使い物にならなくなるからだろうけど凄いなあ.

御意見は光成滋生<herumi@nifty.com>までお願いします