憂鬱な午後のひととき
明け方3~4時頃の集中豪雨の凄まじさはなかった. 雨漏りするんじゃないかと思ったぐらい.
・天気悪くて日食見られなかったなあ. 残念. 悪石島に行った人もお気の毒でした.
・
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だと難しいけど), 静的解析ツール使ってそういうバグつぶすべき.
府中郷土の森博物館に
無人小惑星探査機「はやぶさ」のドキュメンタリーを見に行った.
あまりよく知らなかったのだけど通信が途絶えてから復活するシーンとかえらい感動した. 昔ボイジャー1号, 2号に興奮したくちの人はぜひ見るべし.
「ロボカップ2009グラーツ世界大会」ロボカップジュニア
優勝は小学4年生. 自分で設計して作るのか. 凄いなあ. 自分自身が制作者であることを示さないといかんかったというのがなんとも.
プレゼンシートのプログラムの工夫ではお金を使って2進数の勉強か.
直木賞
時と人三部作や『ひとがた流し』でなくてベッキーさんとはなんだかな. 前作ならまだしも, あの最終巻ってのはどうかと思う.
『坊っちゃん』(夏目漱石)
なんとなく読んでみたが, 全然面白くなかった. 田舎に飛ばされて八つ当たりしてる短気で手の早い浅はかな主人公に共感できない.
小学生のときは面白がってたという記憶はあるんやけど. 意外だ. ところで生徒にからかわれるところとか, 下宿してるとかって, 『鹿男あをによし』(万城目学)はこれを念頭に置いてたのかな. 堀田さんも出てくるし(もちろん話は全然違う).
もっぺん読んだら何か気が付くかも.
・
eval厨
へぇ, shinhさんはeva厨だったのかとしばし勘違いした.
・
パズルの国のアリス 死刑囚の生き残り戦略
これは面白かった. 一見不可能に思える問題の意外性, シンプルだけど巧妙な回答など, 近年見たパズルの中では1, 2位を争う.
あるプロセスでひたすら追記しているファイルを別プロセスで読み続ける(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しても駄目みたいだ. めんどいなあ.
朝, 太陽が出てたのに駅までのわずか百メートルちょいの間に物凄い雨が降ってずぶ濡れ. ああいうのもきつねの嫁入りというのだろうか. どちらかというと狸にばかされた感じだが. その後は晴れで満月(今年最小らしい)やね.
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>までお願いします