2011-10-21 11 views
0

誰かがmallocにsigsegvの信号を送るようなコードを書けますか? ヒープの破損はmallocのsigsegvにつながるかもしれませんが、理解できません。SIGSEGV in malloc?

ありがとうございます。

+0

http://stackoverflow.com/questions/1441017/how-can-malloc-cause-a-sigsegv/1441105#1441105 –

答えて

2

これは問題を引き起こす可能性がありますが、malloc()ではなく、free()である可能性があります。これはSIGSEGVを提供します。

void *vp = malloc(1024); 
memset((char *)vp - 32, 0, 1024); 
free(vp); 

あなたはとmalloc()にクラッシュする可能性があります:

enum { SZ_ALLOC = 1024, SZ_PREFIX = 32, SZ_SUFFIX = 32, SET_BYTE = '\0' }; 

void *v1 = malloc(SZ_ALLOC); 
free(v1); 
memset((char *)v1 - SZ_PREFIX, SET_BYTE, SZ_ALLOC + SZ_PREFIX + SZ_SUFFIX); 
void *v2 = malloc(SZ_ALLOC); 

これは前に、それが連続して割り当てられます保存されている場合は破損している任意の制御情報に思われる割り当てられたメモリ、後に32のバイトを上書きしますメモリ(通常はそうです)。ゼロを使​​用すると、ヌルポインタへのアクセスが可能になります。データを上書きする別の値を選択することができます。これは、サイズがゼロよりも大きくなることを意味する場合があります(サイズがゼロの場合、メモリアクセスから保護される場合があります)。

もちろん、これは完全に定義されていない動作です。 memset()にクラッシュする可能性があります。クラッシュしないこともあります。

1

はこれを試してみてください:

void **x = malloc(1000); 
free(x); 
x[0] = x[1] = "hello"; 
x = malloc(1000); 

それはちょうど、解放されたブロックは変更不可メモリへのポイントにのメンバーであるリンクフリーリストを破壊することによって動作します。 mallocがこのリストからデキューしようとすると、クラッシュが発生します。 mallocfreeがO(1)である実装では、ほぼ確実に動作します。

+0

私はvitualboxの私のubuntuでテストしましたが、何も起こっていません、何か間違っていますか? –

+0

私はそれを試していませんでしたが、どのようにクラッシュしないか想像できません... –

+0

私はglibcでクラッシュしないことを確認しました。残念ながら、私はメカニズムを解明していません... –