、ShiqueセグメンテーションFALTの読み出し動作と書き込み発生奇妙な問題に対するメモリのブロックを割り当てるMALLOC。

現象の開始:メモリのmallocの作品、読み取りおよび書き込み操作の発生FALTセグメンテーションを。malloc関数が失敗した場合、一般的に、我々は、malloc関数は、すべての利用可能であるべきポインタを返し、さらに読み取られるので、後に、例外をスローする必要があります。だから、非常に奇妙な出会いにこの問題を感じています。

現象を続行:印刷されたアドレスは必ずアドレスを操作前のアドレスである後。説明アドレスは、保護地域のシステムではありません。

現象を続行:メモリのセグメントが問題であることのみを示し、いくつかの安価な缶のアクセスの前にあるアドレスへのアドレスで安く見つけます。メモリは、疑いいくつかのコードセグメントを改ざんされています。

フラッシュバック:このメモリ上の当時と、munmap 1835008より大きいと、コアアンドリュースになります。

测试代码:
{
INT test_size = 1835008。
std :: coutの<< "test_size:" << test_size <<はstd ::てendl;
CHAR * ABC =(CHAR *)のmalloc(test_size)。
ABC [1] = '';
std :: coutの<<(長い長い)ABC <<はstd ::てendl;
std :: COUT << ABC [1] <<はstd :: ENDL。
std :: coutの<<と、munmap(ABC test_size)<<はstd ::てendl;
std :: COUT << ABC [1] <<はstd :: ENDL。
無料(ABC);
ABC =(CHAR *)のmalloc(test_size)。
std :: coutの<<(長い長い)ABC <<はstd ::てendl;
std :: COUT << ABC [1] <<はstd :: ENDL。
}

{
INT test_size = 1835009。
std :: coutの<< "test_size:" << test_size <<はstd ::てendl;
CHAR * ABC =(CHAR *)のmalloc(test_size)。
ABC [1] = '';
std :: coutの<<(長い長い)ABC <<はstd ::てendl;
std :: COUT << ABC [1] <<はstd :: ENDL。
std :: coutの<<と、munmap(ABC test_size)<<はstd ::てendl;
std :: COUT << ABC [1] <<はstd :: ENDL; //即使没有这句、下一句打印仍然会コア的
遊離(ABC)。
ABC =(CHAR *)のmalloc(test_size)。
std :: coutの<<(長い長い)ABC <<はstd ::てendl;
std :: COUT << ABC [1] <<はstd :: ENDL。
}

:結果
test_size:1835008
506 508 402 240
A
-1 506 508 401 344

test_size:1835009
506510442496 0 セグメンテーションフォールト


メモリへのアプリケーションの前面にメモリが後で再び適用し、利用可能な状態で506508402240さらにときときにアクセスできなくなります。

 

結論:感がメモリはMMAPによって割り当てられるように複数1,835,008アンドリュースである(MMAPメモリ割り当てを使用して、定義することによって限定されるGLIBC長いライフサイクルまたは場合特に大きなptmallocが実装を有することになる。)この場合、メモリブロックがあってもよいですアンマップはオフになっているが、アンマップをオフした後に、メモリ・ブロックは、セグメンテーションフォールトをリードします。このと、munmapで命令が言及しました。()はmmapを呼び出すときにアドレスが返された(と、munmapプロセスのアドレス空間にマッピングを解除するための呼び出しは、addrが、lenはマッピング領域のサイズです。マッピング関係を解除すると、元のアドレスマッピングへのアクセスは、セグメンテーションフォールトが発生した原因となります。 )

munmapの推測では、紛争管理の混乱につながったglibc glibcの操作は、メモリの機構の動作を再マッピングすることはできませんで動作しています。

おすすめ

転載: www.cnblogs.com/dongzhiquan/p/11939391.html