K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[355] crowbar MEMモジュール
投稿者:tos
2007/02/20 02:13:25

皆さんこんにちは、tosです。 crowbarのMEMモジュールに関して質問があります。 memory.cの void set_header(Header *header, int size, char *filename, int line) { . . . memset(header->s.mark, MARK, (char*)&header[1] - (char*)header->s.mark); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ } でmemsetのサイズとしてMARK_SIZEでは無く、上記のようなサイズを設定しているのは、 パディングを考慮してのことなのかなと思いますが、 void check_mark_sub(unsigned char *mark) { int i; for (i = 0; i < MARK_SIZE; i++) { if (mark[i] != MARK) { fprintf(stderr, "bad mark\n"); abort(); } } } でチェックしているのは、MARK_SIZEのようです。 これだと、(char*)&header[1] - (char*)header->s.mark)がMARK_SIZEでは無かった場合、 チェック漏れが起きてしまいそうな気がするのですが、あっていますでしょうか?(ヨワヨワです)
[この投稿を含むスレッドを表示] [この投稿を削除]
[356] Re:crowbar MEMモジュール
投稿者:(ぱ)
2007/02/20 02:13:25

>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()を別々に 作ってもたいした手間ではありません。チェックの甘さはさておき、 ソースの統一感という点からすると、修正したほうがよいかもしれませんね。 正直、あまり優先度は高くないですが、気が向いたら直しておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[357] Re:crowbar MEMモジュール
投稿者:tos
2007/02/20 02:13:25

細かい突っ込みで時間を取っていただき、申し訳ありません。 ただ、私は前橋さんを勝手に師匠と思って、ソースを勉強させていただいて いますので、もう少しお付き合いください。 (char*)&header[1] - (char*)header->s.markがパディングを考慮したものだとすると、 (char*)&header[1] - (char*)header->s.markの値は、MARK_SIZEよりも大きい場合が あると思います。 そうすると、 >しかし、このへんが壊れるのはほとんど配列のオーバランで、もしそうなら、 >(char*)&header[1] - (char*)header->s.mark)とMARK_SIZEの隙間より先に、 >MARK_SIZEでチェックしている部分が壊れるはずです。 とはならず、「(char*)&header[1] - (char*)header->s.mark)とMARK_SIZEの隙間」 の方が先に壊れるような気がするのですが、違いますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[360] Re:crowbar MEMモジュール
投稿者:(ぱ)
2007/02/20 02:13:25

> とはならず、「(char*)&header[1] - (char*)header->s.mark)とMARK_SIZEの隙間」 >の方が先に壊れるような気がするのですが、違いますでしょうか?  すみません、勘違いしていました。tosさんが心配しておられるのは、 アプリケーションに返す領域の「前の」MARK部分なのですね。  それだとおっしゃるとおりチェック漏れを起こすと思います。どういうわけか、 後ろのMARKのことだとばかり思い込んでいました。  ご指摘ありがとうございました。次のバージョンで直します。 >ただ、私は前橋さんを勝手に師匠と思って、ソースを勉強させていただいて >いますので、もう少しお付き合いください。 というわけで、私はこの通りポカもミスも人並み以上にしますので、 全然たいしたことはないです f(^^;;;
[この投稿を含むスレッドを表示] [この投稿を削除]
[363] Re:crowbar MEMモジュール
投稿者:tos
2007/02/20 02:13:25

> それだとおっしゃるとおりチェック漏れを起こすと思います。どういうわけか、 また、ボケた質問しているんじゃないかと思って、ドキドキしてましたが、 今回はあってたみたいで安心しました。 >というわけで、私はこの通りポカもミスも人並み以上にしますので、 >全然たいしたことはないです f(^^;;; いえいえ、これからも前橋さんのソースで勉強させていただきます。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]