>check_mark_sub(unsigned char *mark)
...
>でチェックしているのは、MARK_SIZEのようです。
はい。これは単に、アプリケーションに返す領域の「前に入れたマーク」と
「後ろに入れたマーク」で同じcheck_mark_sub()を使いたかったため
…だったと思います。要するに単なる手抜きです。
関連するソースはこのへん:
http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/5.html#148
>これだと、(char*)&header[1] - (char*)header->s.mark)がMARK_SIZEでは無かった場合、
>チェック漏れが起きてしまいそうな気がするのですが、あっていますでしょうか?(ヨワヨワです)
(char*)&header[1] - (char*)header->s.mark)とMARK_SIZEの差にあたる部分を
選択的に破壊するようなバグがあれば、確かにチェック漏れを起こすはずです。
しかし、このへんが壊れるのはほとんど配列のオーバランで、もしそうなら、
(char*)&header[1] - (char*)header->s.mark)とMARK_SIZEの隙間より先に、
MARK_SIZEでチェックしている部分が壊れるはずです。
MEMでできるのはどっちみち確率的なチェックでしかありません。たとえば
たまたま0xCDでマーク部分を破壊されたら気付きませんし、MEMで保持している
連結リストをぶっ壊されたら原因の究明は困難になってしまいます。
そう考えれば、この程度のチェックの甘さは許容範囲かなあ、と思っています。
だったら0xCDを詰めるのも、最初からMARKのサイズだけでいいじゃん、という
ツッコミはもちろんあり得るわけですが、そんなことでたいして速度が稼げる
わけじゃなし、どうでもいいんじゃないかなあ、と。
ただし、もちろんmark_check_head()とmark_check_tail()を別々に
作ってもたいした手間ではありません。チェックの甘さはさておき、
ソースの統一感という点からすると、修正したほうがよいかもしれませんね。
正直、あまり優先度は高くないですが、気が向いたら直しておきます。