46

タイトルが示すように、私は C を初めて使用し、間もなく中間試験を控えています。私は現在、過去の論文から改訂を行っており、繰り返されるテーマは二重自由問題です。同じメモリ位置を 2 回呼び出すプロセスであることは理解していますが、free()答え方が 100% わからないいくつかの質問があります。

質問 1: C での double free の結果は何ですか? また、なぜこのような問題が生じるのですか?

これにより、二重解放が発生します。

char* ptr = malloc(sizeof(char));

*ptr = 'a';
free(ptr);
free(ptr);

これに対する私の回答は、0x0 メモリ アドレスが返され、システムの不安定性やクラッシュが発生するというものです。また、記憶が正しければ、ダブル フリーは実際にはmalloc2 回呼び出すことができ、その結果バッファ オーバーフローが発生し、システムが脆弱なままになります。

この質問を簡単に要約するには、どうするのが一番良いでしょうか?

質問 2: C で double free を導入するのが特に簡単な状況を説明してください。

あなたの周りにポインターを渡すと、ある関数で誤って解放し、気付かずに再び解放する可能性があると考えていましたか?

繰り返しますが、これを要約する「最良の」方法は何ですか?

4

4 に答える 4

52

技術的に言えば、C の double free は未定義の動作につながります。これは、プログラムが完全に恣意的に振る舞うことができ、何が起こるかについてすべての賭けがオフであることを意味します. それが起こったのは確かに悪いことです!実際には、メモリ ブロックを二重に解放すると、メモリ マネージャーの状態が破損し、既存のメモリ ブロックが破損したり、将来の割り当てが奇妙な方法で失敗したりする可能性があります (たとえば、同じメモリが 2 つのメモリに渡されるなど)。の異なる連続呼び出しmalloc)。

二重解放は、あらゆる種類のケースで発生する可能性があります。かなり一般的なのは、複数の異なるオブジェクトがすべて相互へのポインターを持ち、 への呼び出しによってクリーンアップされ始める場合freeです。これが発生した場合、注意しないfreeと、オブジェクトをクリーンアップするときに同じポインターを複数回使用する可能性があります。とはいえ、他にもたくさんのケースがあります。

お役に立てれば!

于 2014-01-11T01:43:36.867 に答える