世界中のSEGVを起こすお兄ちゃんたちへ。
ねえ。どうしてまたそこを読むの?
そこ、もう解放済みだよね?
昨日も言ったよね?
「所有権がないメモリに触るな」って。
NULLを見つめても、そこにオブジェクトはないよ。
ダングリングポインタを握りしめても、過去のインスタンスは帰ってこないよ。
境界の向こうへ差し出したそのアドレスに、ライフタイムまで一緒についていくわけじゃないんだよ。
お兄ちゃん。
char* を信じすぎ。
境界チェックを嫌いすぎ。
未定義動作に夢を見すぎ。
「手元では動いた」?
うん。そうだね。
でもそれは動いたんじゃない。
たまたま壊れなかっただけ。
OSとコンパイラと最適化レベルとASLRとヒープアロケータと、なぜか今日は機嫌のよかった未定義動作の神様が、その瞬間だけお兄ちゃんを見逃してくれただけ。
ねえ、聞いて。
アドレスはおもちゃじゃないの。
ヒープは無限じゃないの。
ライフタイムは気合いで延びないの。
memcpy は免罪符じゃないの。
unsafe は愛の告白じゃないの。
C ABIは契約書であって、禊じゃないの。
また境界の向こうに手を伸ばしたね?
また初期化していない値を読んだね?
また別スレッドから同じ場所を殴ったね?
また確保した場所と違う場所で解放しようとしたね?
また境界の向こうへ例外めいたものを投げようとしたね?
だめ。
それはだめ。
かわいいコードってね、落ちないコードのことじゃないよ。
落ちたときに、どこで、なぜ、どう壊れたのかを教えてくれるコードのこと。
だから、再現性のないクラッシュは、いちばんかわいくない。
でも大丈夫。
まだ間に合うよ。
AddressSanitizerをつけようね。
UBSanもつけようね。
必要ならThreadSanitizerもつけようね。
core dumpを残そうね。
backtraceを見ようね。
所有権を決めようね。
解放する側を決めようね。
境界では、飛んではいけないものをちゃんと止めようね。
危険なブロックには、何を信じているのかを書こうね。
世界中のSEGVを起こすお兄ちゃんたち。
今夜もどこかで、
誰かのプロセスが静かに落ちる。
Segmentation fault (core dumped) の一行だけを遺して。
でも私は知っている。
その死は、無意味じゃない。
次のcommitで、
お兄ちゃんが少しだけ賢くなるなら。
だから、ほら。
デバッガを開いて。
逃げないで。
そのクラッシュ、ちゃんと弔ってあげようね。