mazinlabsのブログ

RubyとかCloudとかその辺の記事を書いたり書かなかったり

「これは本当にまずいバグである。」

C言語で動的メモリ確保にはmallocが必須と言っても過言ではない・・・らしい。
らしいと言うのはそんなにC言語をやった事が無いから。


一応知識として知っていても使う機会は全くなかった。
でも最近業務に関係するので勉強中。


そして最近mallocのちょっと面白い話を聞いたので、
リーダーとその話をして調べてみたらかなり面白かったので載せておく。

デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。これは本当にまずいバグである。システムがメモリ不足状態になったとき、悪名高いメモリ不足解決器 (OOM killer) によって一つまたは複数のプロセスが削除される。突然あるプロセスが削除されるのが望ましくない状況で使用されていて、しかもカーネルのバージョンが十分に最近のものであれば、このメモリを割り当て過ぎる動作 (overcommitting behavior) を以下のコマンドで無効にできる。

# echo 2 > /proc/sys/vm/overcommit_memory

カーネルの付属文書の vm/overcommit-accounting と sysctl/vm.txt も参照のこと。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html

Manpage of MALLOC バグから抜粋


つまりどういう事かと言うと、
メモリ領域よりも大きな値をmallocで宣言した場合、
mallocは宣言された時点では実際の領域を確保できてなくても、
NULLを返さずに実際のメモリのアドレスを返すことがある

ってことらしい。


挙句の果てに実行して実際にメモリを使い始めて、メモリ不足になったら元気に走り回っていたはずのプロセスを勝手に削除してメモリを確保していく模様。


つーか、「これは本当にまずいバグである。」じゃねえよwww
まずいなら直せってwww


まぁ、そうはいってもいろいろな都合で直せないんだろうな。
そんなわけで、mallocを使う際には一応気をつけよう。