[BitVisor-devel:109] Re: free()の挙動について
Hideki EIRAKU
hdk @ igel.co.jp
2017年 3月 31日 (金) 16:39:22 JST
イーゲル 榮樂です。
From: Toshiki Yagi <toshiki.yagi @ field-stone.jp>
Subject: [BitVisor-devel:108] free()の挙動について
Date: Fri, 31 Mar 2017 14:45:06 +0900
> ふと気がついたのですが、free()の挙動についてISO標準と若干動きが
> 異なるのが気になりました。
>
> core, processについて共通の差異:
> free(NULL) は何もせずreturnする仕様のはずが実際にメモリ解放を
> 行おうとする(結果panicとなる)。
>
> mbedtlsの移植を行った際に気が付きましたが、この挙動は敢えて
> このようにしているのでしょうか?
はい、そもそも malloc() はないですし、free() はたまたま関数名が同じと
いうだけで、何かの標準に沿ったものではありません。printf() 等も同様で
す。例えば snprintf() は C99 ではサイズが足りない時には必要な長さを返
すということになっているようですが、BitVisor の snprintf() はいっぱい
になったところで打ち切ってしまいます。
alloc() の挙動も独特で、以下のサイトに簡単な説明がありますが、2 のべき
乗単位に切り上げた大きさで確保し、アラインメントも大きさに合わせます。
16 バイトより小さい場合は 16 バイトで、1024 バイトを超える場合はページ
単位の確保を使用します。例えば 513 バイトを確保すれば 1024 バイトが確
保され、1023 との論理積をとれば 0 になるアドレスが返されます。無駄な領
域が多く改良の余地はあるのですが、アラインメントをあてにしている部分が
多々あって (特にドライバー内)、改良の際は注意が必要です。
http://qiita.com/hdk_2/items/e4f51d4a6f3ce1c33567
--
Hideki EIRAKU <hdk @ igel.co.jp>
BitVisor-devel メーリングリストの案内