<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>日本野望の会 &#187; level☆☆☆</title>
	<atom:link href="http://yabooo.org/archives/category/level%e2%98%86%e2%98%86%e2%98%86/feed" rel="self" type="application/rss+xml" />
	<link>http://yabooo.org</link>
	<description>いずれにせよITで世界征服をたくらむ悪の組織です。</description>
	<lastBuildDate>Mon, 28 Dec 2009 14:30:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C言語で使用メモリをカウントする。</title>
		<link>http://yabooo.org/archives/65</link>
		<comments>http://yabooo.org/archives/65#comments</comments>
		<pubDate>Wed, 06 Feb 2008 13:58:28 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[article]]></category>
		<category><![CDATA[level☆☆☆]]></category>

		<guid isPermaLink="false">http://www.yabooo.org/archives/65</guid>
		<description><![CDATA[どうもひろきのだいちです。
最近、初心者にとっていちばんよい言語は・・みたいな話が出てますが、
いちばんよい言語というのはたぶん「近くに一番優しくわかりやすく丁寧に教えてくれる人のいる言語」だと思います。
別に言語なんて [...]]]></description>
			<content:encoded><![CDATA[<p>どうもひろきのだいちです。</p>
<p>最近、初心者にとっていちばんよい言語は・・みたいな話が出てますが、<br />
いちばんよい言語というのはたぶん「近くに一番優しくわかりやすく丁寧に教えてくれる人のいる言語」だと思います。</p>
<p>別に言語なんて関係ないです。</p>
<p>でも、いろいろとできることが違うという意味ではC言語はすごいです。<br />
今日はC言語を使ってプログラムの利用メモリを出力してくれるようなソフトを書いてみました。<br />
<span id="more-65"></span></p>
<h3>はじめに</h3>
<p>こんな風にランダムに生成した数字をquick sortして順番に出力するプログラムがあったとします。</p>
<pre>
$ ./qsort 10
      133557644      467172391
      587048537      700406542
      924651875      942877877
     1231884300     1236726036
     1563773570     1858205801
</pre>
<p>こんな風にランダムに生成した数字をquick sortして順番に出力するプログラムがあったとします。<br />
これにfleafeedとつけるだけで・・・</p>
<pre>
$fleafeed ./qsort 10
      133557644      467172391
      587048537      700406542
      924651875      942877877
     1231884300     1236726036
     1563773570     1858205801

-----------fleafeed results------------
--USING STACK   :    1160 bytes
--USING HEAP    :       0 bytes
--ALLOC times   :       0
--FREE times    :       0
</pre>
<p>こんな付加情報を追加してくれるやつを作ってみました。</p>
<p>さらにただ、mallocして放置するというドSなプログラムを</p>
<div class="igBar"><span id="lc-7"><a href="#" onclick="javascript:showCodeTxt('c-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-7">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> i=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>;i&lt;<span style="color: #cc66cc;color:#800000;">100</span>;i++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;&nbsp; &nbsp;<span style="color: #993333;">void</span> *p=malloc<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;color:#800000;">100</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;&nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"%x"</span>,p<span style="color: #66cc66;">&#41;</span>; </div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"hello!world"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
試してみると・・・</p>
<pre>
-----------fleafeed results------------
--USING STACK   :    1076 bytes
--USING HEAP    :   10000 bytes
--ALLOC times   :     100
--FREE times    :       0
</pre>
<p>こんなかんじで、計算どおりヒープの数とmallocの数がカウントされてます。</p>
<p>これの作り方の前にちょっと基礎知識を。<br />
わかる人は読み飛ばしてください。まちがった説明するかもなので＞＜</p>
<h3>スタックとかヒープとかってなに？</h3>
<p>スタックとかヒープとかってのは、プログラムの管理領域であるメモリの役割につけられた名前です。</p>
<p>スタックは関数呼び出しや引数、関数内自動変数などを管理するメモリの領域です。<br />
面倒なので、wikipedia先生に頼ると<br />
・<a href="http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF">スタック</a><br />
・<a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF">コールスタック</a></p>
<p>こんなかんじのものです。</p>
<p>ヒープとは固定サイズじゃなくて自由に別途に確保できるところにあるメモリーです。<br />
通常mallocでメモリーをもらってfreeで返します。</p>
<p>もらったものは必ず返さないといけないんですが、最近の言語ではGC（ガーベジコレクション）というステキ機能がついていて<br />
変わりに返してくれます。連帯保証人みたいなひとです。</p>
<p>これだけだとあれなのでまたまた、wikipedia先生に・・<br />
・<a href="http://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F">ヒープ領域</a><br />
・<a href="http://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F">ヒープ構造</a></p>
<h3>スタック編</h3>
<p>理屈は簡単です。<br />
一番最初に一度使われる前のスタック領域を俺色に染め上げて、<br />
プログラムを実行し、なんらかの形で利用されると別の値になってしまうので<br />
一番最後に俺色になっていないところの数を数え上げるという方法です。</p>
<p>そのために</p>
<div class="igBar"><span id="lc-8"><a href="#" onclick="javascript:showCodeTxt('c-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-8">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_FIRST __attribute__ ((constructor))</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_LAST&nbsp; __attribute__ ((destructor)) </span></div>
</li>
</ol>
</div>
</div>
</div>
<p>
こんな宣言をしてmain関数より前に関数を実行させます。</p>
<div class="igBar"><span id="lc-9"><a href="#" onclick="javascript:showCodeTxt('c-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-9">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_MAGIC 0xf1eafeed</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_MAX 1024*1024</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">FF_FIRST <span style="color: #993333;">int</span> fleafeed_fillstack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> p<span style="color: #66cc66;">&#91;</span>FF_MAX<span style="color: #66cc66;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> i=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>;i&lt;FF_MAX;i++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;&nbsp; &nbsp;p<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>=FF_MAGIC;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">FF_LAST <span style="color: #993333;">void</span> fleafeed_checkstack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> p<span style="color: #66cc66;">&#91;</span>FF_MAX<span style="color: #66cc66;">&#93;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> i=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>;i&lt;FF_MAX;i++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;&nbsp; &nbsp;FF_USESTACK+=<span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>==FF_MAGIC<span style="color: #66cc66;">&#41;</span>?<span style="color: #cc66cc;color:#800000;">0</span>:<span style="color: #cc66cc;color:#800000;">4</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
このときに埋め立てる値を0xf1eafeedとう値にしたので<br />
このプログラムの名前はfleafeedになりました。</p>
<p>適当に16進数で表現できる8文字の英語をいれただけです。<br />
意味はわかりません＞＜</p>
<p>これで、スタックの仕様数はわかりました。<br />
これを</p>
<pre>
$gcc fleafeed.c -share -fPIC -o libfleafeed.so
</pre>
<p>のようにしてコンパイルします。これでできたライブラリをリンクしてやれば、スタックの使用量がわかります。</p>
<p>次はヒープです。</p>
<h3>ヒープ領域編</h3>
<p>ヒープは、よほど無理をしないかぎり、mallocなどから呼ばれるのでこの関数をwrapperしてやればヒープの使用量はわかります。<br />
というわけで、</p>
<div class="igBar"><span id="lc-10"><a href="#" onclick="javascript:showCodeTxt('c-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-10">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">void</span> *malloc<span style="color: #66cc66;">&#40;</span>size_t size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_ALLOCCOUNT++;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_USEHEAP+=size;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">return</span> malloc<span style="color: #66cc66;">&#40;</span>size<span style="color: #66cc66;">&#41;</span>;<span style="color: #808080; font-style: italic;">//本物のmalloc?</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
というような感じでラッパしたいのですが、これだとmallocという名前が衝突してしまいます。<br />
そんなわけで</p>
<div class="igBar"><span id="lc-11"><a href="#" onclick="javascript:showCodeTxt('c-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-11">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define GNU_SOURCE</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include &lt;dlfcn.h&gt;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span>*<span style="color: #66cc66;">&#40;</span>*libc_malloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>size_t<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span>*<span style="color: #66cc66;">&#40;</span>*libc_calloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>size_t,size_t<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span> <span style="color: #66cc66;">&#40;</span>*libc_free&nbsp; <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">void</span> *malloc<span style="color: #66cc66;">&#40;</span>size_t size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_ALLOCCOUNT++;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_USEHEAP+=size;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span>*libc_malloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>size<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">FF_FIRST <span style="color: #993333;">int</span> fleafeed_fillstack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;libc_malloc=dlsym<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>-1L,<span style="color: #ff0000;">"malloc"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
こんな感じにdlsymのRTLD_NEXTをつかって、mallocのポインタをlibc_mallocという代理人にあずけておきます。<br />
なぜかRTLD_NEXTが#defineされてなかったので即値で対応しました。</p>
<h3>共有ライブラリを事前に読み込む</h3>
<p>ソースコードがあればそこからビルドするときになんとかすればいいんですが、そうではないので事前にライブラリを読み込むようにしてコマンドを呼び出すという方法をとります。</p>
<pre>
alias fleafeed=LD_PRELOAD=./libfleafeed.so
</pre>
<p>こんなかんじに。LD_PRELOADはこのライブラリは最初に読み込んじゃって！という環境変数です。<br />
これで準備は万端。</p>
<p>ためしにgccでコンパイルをするときの利用状況を見てみましょう。</p>
<pre>
$ fleafeed gcc test.c

-----------fleafeed results------------
--USING STACK   :    6072 bytes
--USING HEAP    :  832510 bytes
--ALLOC times   :    1776
--FREE times    :     833

-----------fleafeed results------------
--USING STACK   :    2272 bytes
--USING HEAP    : 1810165 bytes
--ALLOC times   :     863
--FREE times    :      48

-----------fleafeed results------------
--USING STACK   :    5980 bytes
--USING HEAP    : 1715525 bytes
--ALLOC times   :    1185
--FREE times    :     355

-----------fleafeed results------------
--USING STACK   :    2012 bytes
--USING HEAP    :   25998 bytes
--ALLOC times   :     128
--FREE times    :      35

-----------fleafeed results------------
--USING STACK   :    5840 bytes
--USING HEAP    :   33885 bytes
--ALLOC times   :     336
--FREE times    :     181
</pre>
<p>うわなんかいっぱい出たｗ</p>
<p>プロセス分だけ終わりがあるので、プロセスごとに出力されるようです。</p>
<p>最後に全体のソースコード。</p>
<div class="igBar"><span id="lc-12"><a href="#" onclick="javascript:showCodeTxt('c-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-12">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define GNU_SOURCE</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include &lt;dlfcn.h&gt;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_FIRST __attribute__ ((constructor))</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_LAST&nbsp; __attribute__ ((destructor))</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_MAGIC 0xf1eafeed</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#define FF_MAX 1024*1024</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> FF_ALLOCCOUNT=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> FF_FREECOUNT=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> FF_USEHEAP=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> FF_USESTACK=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span>*<span style="color: #66cc66;">&#40;</span>*libc_malloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>size_t<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span>*<span style="color: #66cc66;">&#40;</span>*libc_calloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>size_t,size_t<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">static</span> <span style="color: #993333;">void</span> <span style="color: #66cc66;">&#40;</span>*libc_free&nbsp; <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">void</span> *malloc<span style="color: #66cc66;">&#40;</span>size_t size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_ALLOCCOUNT++;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_USEHEAP+=size;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span>*libc_malloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>size<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">void</span> *calloc<span style="color: #66cc66;">&#40;</span>size_t nmemb,size_t size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_ALLOCCOUNT++;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_USEHEAP+=size*nmemb;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span>*libc_calloc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>nmemb,size<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">void</span> free<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *ptr<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;FF_FREECOUNT++;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span>*libc_free<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>ptr<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">/*void *realloc(void *ptr,size_t size){</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;"></li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">}*/</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">FF_FIRST <span style="color: #993333;">int</span> fleafeed_fillstack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> p<span style="color: #66cc66;">&#91;</span>FF_MAX<span style="color: #66cc66;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> i=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;libc_malloc=dlsym<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>-1L,<span style="color: #ff0000;">"malloc"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;libc_free=dlsym<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>-1L,<span style="color: #ff0000;">"free"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;libc_calloc=dlsym<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">void</span> *<span style="color: #66cc66;">&#41;</span>-1L,<span style="color: #ff0000;">"calloc"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>;i&lt;FF_MAX;i++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;&nbsp; &nbsp;p<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>=FF_MAGIC;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">FF_LAST <span style="color: #993333;">void</span> fleafeed_checkstack<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> p<span style="color: #66cc66;">&#91;</span>FF_MAX<span style="color: #66cc66;">&#93;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #993333;">int</span> i=<span style="color: #cc66cc;color:#800000;">0</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>;i&lt;FF_MAX;i++<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;&nbsp; &nbsp;FF_USESTACK+=<span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>==FF_MAGIC<span style="color: #66cc66;">&#41;</span>?<span style="color: #cc66cc;color:#800000;">0</span>:<span style="color: #cc66cc;color:#800000;">4</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;fflush<span style="color: #66cc66;">&#40;</span>stdout<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;fprintf<span style="color: #66cc66;">&#40;</span>stderr,<span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>-----------fleafeed results------------"</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;fprintf<span style="color: #66cc66;">&#40;</span>stderr,<span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>--USING STACK<span style="color: #000099; font-weight: bold;">\t</span>:%8d bytes"</span>,FF_USESTACK<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;fprintf<span style="color: #66cc66;">&#40;</span>stderr,<span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>--USING HEAP<span style="color: #000099; font-weight: bold;">\t</span>:%8d bytes"</span>,FF_USEHEAP<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;fprintf<span style="color: #66cc66;">&#40;</span>stderr,<span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>--ALLOC times<span style="color: #000099; font-weight: bold;">\t</span>:%8d"</span>,FF_ALLOCCOUNT<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:IG_LINE_COLOUR_1;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;fprintf<span style="color: #66cc66;">&#40;</span>stderr,<span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>--FREE times<span style="color: #000099; font-weight: bold;">\t</span>:%8d<span style="color: #000099; font-weight: bold;">\n</span>"</span>,FF_FREECOUNT<span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:IG_LINE_COLOUR_2;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://yabooo.org/archives/65/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>プログラマのための英文法（笑）</title>
		<link>http://yabooo.org/archives/61</link>
		<comments>http://yabooo.org/archives/61#comments</comments>
		<pubDate>Sun, 03 Feb 2008 19:17:36 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[article]]></category>
		<category><![CDATA[level☆☆☆]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.yabooo.org/archives/61</guid>
		<description><![CDATA[

再びちょっとしたネタ記事。
皆さん英語は好きですか？僕は嫌いです。
英語の勉強は覚えるとかばっかりで理解を促してくれません。
こんな英文があります。

Reading is to the mind what food [...]]]></description>
			<content:encoded><![CDATA[<link rel="StyleSheet" href='http://www.yabooo.org/wp-content/uploads/2008/01/prog.css'  type="text/css" />
<script src="http://www.yabooo.org/wp-content/uploads/2008/01/invoke.js"></script><br />
再びちょっとしたネタ記事。</p>
<p>皆さん英語は好きですか？僕は嫌いです。<br />
英語の勉強は覚えるとかばっかりで理解を促してくれません。</p>
<p>こんな英文があります。</p>
<pre>
Reading is to the mind what food is to the body.
（たべものが体にとって大事なように読書も精神にとって大事である。）
</pre>
<p>いわゆる、A is to B what C is to D.の構文なんですが、<br />
これをそのまま覚えるのって苦行ですよね。</p>
<p>苦行は嫌いなので、論理的に覚えたいと思います。</p>
<p><span id="more-61"></span></p>
<pre class="source">
SVCM構文のルール：（例外はあるけど暫定的に）
1.SVCMを名詞相当句にするにはS|Cのうち、欠けている物を関係詞whatで補い前置する。
2.CとMはCが長くなると逆転しSVMCにしてもよい。
3.Cには名詞相当句が入る

ここで、
a is ** to b（bにとってaは**だ。）---(1)
c is ** to d（dにとってcは**だ。）---(2)
を考える。

ルール1により、(2)を名詞相当句にする。
what c is to d ---(3)
ルール3により、(1)のCに(3)を代入。
a is what c is to d to b. ---(4)
ルール2に(4)を変形
a is to b what c is to d.
</pre>
<p>とこんな感じのルールで動いています。</p>
<p>これをJavaScriptのプログラムにしてみると、</p>
<div class="pg">
<pre class="source">
var SVCM=function(obj){
    this.S=(obj.S)?obj.S:"**";
    this.V=(obj.V)?obj.V:"**";
    this.C=(obj.C)?obj.C:"**";
    this.M=(obj.M)?obj.M:"";
    this.order=["S","V","C","M"];
    this.sentence=true;
};

SVCM.prototype={
    nominalize:function(where){
		this[where]="what";
		this.sentence=false;
		var ord=[where];
		for(var i=0;this.order.length-i>0;i++){
			var e=this.order[i];
			if(e!=where)ord.push(e);
		}
		this.order=ord;
		return this;
    },
    toString:function(){
		var ret=[];
		for(var i=0;this.order.length-i>0;i++){
			ret.push(this[this.order[i]]);
		}
		return ret.join(" ")+((this.sentence)?".":"");
    },
    inverse:function(){
    	var posC,posM;
		for(var i=0;this.order.length-i>0;i++){
			var e=this.order[i];
			if(e=="C"){	posC=i;}
			if(e=="M"){	posM=i;}
		}
		this.order[posC]="M";
		this.order[posM]="C";
		return this;
    }
}

var s1=new SVCM({S:"A",V:"is",M:"to B"});
log(s1);
var s2=new SVCM({S:"C",V:"is",M:"to D"});
log(s2);
s1.C=s2.nominalize("C");
log(s1);
log(s1.inverse());
	</pre>
<div class="console"></div>
<input type="button" value="実行" class="button" onclick="invoke(this)"/>
</div>
<p>	これを少し、発展させて新ルールを追加しましょう。</p>
<pre class="source">
SVCM構文のルール：（例外はあるけど暫定的に）
4.SVMC文を修飾語相当句にするにはwith SCMとする。
</pre>
<p>	というルールを追加してみましょう。</p>
<div class="pg">
<pre class="source" style="display:none;">
var SVCM=function(obj){
    this.S=(obj.S)?obj.S:"**";
    this.V=(obj.V)?obj.V:"**";
    this.C=(obj.C)?obj.C:"**";
    this.M=(obj.M)?obj.M:"";
    this.order=["S","V","C","M"];
    this.sentence=true;
};

SVCM.prototype={
    nominalize:function(where){
		this[where]="what";
		this.sentence=false;
		var ord=[where];
		for(var i=0;this.order.length-i>0;i++){
			var e=this.order[i];
			if(e!=where)ord.push(e);
		}
		this.order=ord;
		return this;
    },
    toString:function(){
		var ret=[];
		for(var i=0;this.order.length-i>0;i++){
			ret.push(this[this.order[i]]);
		}
		return ret.join(" ")+((this.sentence)?".":"");
    },
    inverse:function(){
    	var posC,posM;
		for(var i=0;this.order.length-i>0;i++){
			var e=this.order[i];
			if(e=="C"){	posC=i;}
			if(e=="M"){	posM=i;}
		}
		this.order[posC]="M";
		this.order[posM]="C";
		return this;
    }
}
	</pre>
<pre class="source" >
SVCM.prototype.modifier=function(){
	if(this.sentence){
		this.sentence=false;
		this.P="with";
		var ord=["P"];
		for(var i=0;this.order.length-i>0;i++){
			var e=this.order[i];
			if(e!="V")ord.push(e);
		}
		this.order=ord;
		return this;
	}
	return false;
}
	</pre>
<p>このルールによって、文全体を修飾語として扱うことができます。<br />
すこし実験をして見ましょう。</p>
<pre class="source" >
log("--簡易テスト--");
var sen1=new SVCM({S:"A",V:"is",C:"happy"});
log(sen1);
log(sen1.modifier());
log("--He can't be alive with the earth what it is.--");

var e1=new SVCM({S:"it",V:"is"});
var e2=new SVCM({S:"He",V:"can't be",C:"alive"});
var e3=new SVCM({S:"the earth",V:"is"});
log(e1);log(e2);log(e3);
log(e1.nominalize("C"));
e3.C=e1;
log(e3);
log(e3.modifier());
e2.M=e3;
log(e2);
log("-（地球がこのような有様では、彼は生きてはいないだろう）-")
	</pre>
<div class="console"></div>
<input type="button" value="実行" class="button" onclick="invoke(this)"/>
</div>
<p>どうでしょうか。<br />
３つの文が、要素を変形させて１つの文になっていくさまがわかると思います。</p>
<p>このように教えてくれれば、英語に苦手意識を持つ必要がなかったのに・・・＞＜</p>
]]></content:encoded>
			<wfw:commentRss>http://yabooo.org/archives/61/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
