2012-04-06 4 views
3

c/C++でコールスタックを破損する通常のコードはありますか? 私は一種のハックや何か、ちょっとした見落としミスや何かを意味するのではなく、毎回ダメージを与えるようなランダムなものではありません。 誰かが私に、元社員は管理していましたが、私はそれが可能だとは思わないと言いました。 誰かにこのような経験がありますか?コールスタックにダメージを与えるC/C++コード

+0

C/C++でコールスタックを破損するのは非常に簡単です。それは多くの人々がそれらを憎む理由です。 – iammilind

答えて

6

はい、簡単です。実際、非常に一般的な問題の1つです。これを考慮してください:

void foo() 
{ 
    int i; 
    int *p = &i; 
    p -= 5; // now point somewhere god knows where, generally undefined behavior 
    *p = 0; // boom, on different compilers will end up with various bad things, 
     // including potentially trashing the call stack 
} 

ローカルアレイ/バッファの境界外アクセスの多くは、ゴミ箱になります。

6

はい。多くのプラットフォームでは、ローカル変数はコールスタックとともに格納されます。その場合には、ローカル配列の外の書き込みが破損していることに非常に簡単な方法です:

void evil() { 
    int array[1]; 
    std::fill(array, array+1000000, 0); 
    return; // BOOM! 
} 

は、ローカル変数への参照を返し、もっと微妙が破損する可能性があり、後に呼ばれています関数のスタック:

int & evil() { 
    int x; 
    return x; 
} 
void good(int & x) { 
    x = 0; 
    return; // BOOM! 
} 
void innocent() { 
    good(evil()); 
} 

これらの(実際にはスタックを破損する可能性のある)いずれも合法ではありません。コンパイラはそれらを診断する必要はありません。幸いなことに、適切な警告を有効にする限り、ほとんどのコンパイラはこれらのエラーを検出します。

+0

リンカーとしての私のC変種は、double evil(double a)を見つけます。 ... file1.h 'ダブル悪(ダブルA)は、' FILE1.Cの#include "file1.h" ダブル悪(ダブルA){* 5を返す;} ' main.cの の#include '二重悪(ボイド); //宣言only' INTメイン(ボイド) {のprintf( "結果は、%fと、\ n" は、悪());// BOOM return 0; } –

関連する問題