2012-03-12 16 views
0

問題は、私はtest1()を書いたので、私はあなたにいくつかのコードが表示されます:)静的メモリ領域のオーバーフローを避ける方法はありますか?

#include <stdio.h> 
#include <string.h> 
char *test1() 
{ 
    static char c; 
    char *p; 
    p = &c; 
    printf("p[%08x] : %s\n", (unsigned int)p, p); 
    return p; 
} 

void *test2() 
{ 
    static char i; 
    char *buf; 
    int counter = 0; 
    for(buf = (char *)&i ; ;counter += 8) 
    { 
     memset(buf + counter, 0xff, 8); 
     printf("write %d bytes to static area!\n", counter); 
    } 
} 

int main() 
{ 
    char *p; 
    p = test1(); 
    strcpy(p, "lol i asd"); 
    p = test1(); 
    strcpy(p, "sunus again!"); 
    p = test1(); 
    strcpy(p, "sunus again! i am hacking this!!asdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 
    p = test1(); 
    test2(); 
    return 0; 
} 

まず非常に明白です。 ご覧のとおり、明らかに不正なメモリ領域にアクセスしているため、これらのセグメントにはセグメント・フォルトが発生するはずです。私は静的変数についていくつかの基本を知っていましたが、これは私にとっては奇妙なことです。

次に、私はtest2()を書きました。 最終的には、セグメント障害が発生しました。の後には、の後にほぼ4KBが書き込まれました。

このようなエラー(静的変数のオーバーフロー)が起きないようにするにはどうすればいいですか?

なぜこれらの静的メモリ領域にアクセスできますか? 私は彼らが積み重ねられておらず、積み重ねられていないことも知っています。

PS。たぶん私は自分の問題をはっきりと記述していないかもしれない。 私は何年ものCプログラミング経験を持っています。これが静的でないときに何が起こるかはわかっています。 静的にほとんどすべてが変わり、その理由を知りたい。

+1

Shiftキーを使用すると、あなたの質問が読みやすくなります。 –

+0

@Eric J:または、少なくとも適切に使用する方法を学んでください。 – BoltClock

答えて

1

未定義の振る舞いは - 未定義です。それは動作しているように見えるかもしれませんが、クラッシュするかもしれない、あなたの昼食のお金を盗むかもしれません。ただしないでください。

+0

私は知っている、それは正常ではない。静的変数ではエラーが発生した直後にエラーが発生しますが、これは単に隠れてしまいます。 – sunus

+0

変数に使用しているストレージクラスに関係なくエラーのように見えることは保証されません。 –

0

あなたは失敗の仕方についてはC.

に割り当てなかったメモリを上書きする可能性を避けることができない...場合は、どこで、どのようにあなたのアプリケーションがクラッシュまたはその他の誤動作だけコンパイラに完全に依存しコンパイラはフラグを立て、プログラムが実行を開始する前にランダムな状態のメモリが入っていました。あなたは想定されていないメモリにアクセスしており、そのアクセスがオペレーティング環境に与える影響はCでは完全に定義されていません。

メモリを管理する言語(Java、C#など)がそれを行いますが、もちろん境界チェックにはコストがかかります。

不適切なメモリ管理を検出しようとするメモリ管理ライブラリ(malloc/free/new/deleteの置き換え)を使用することはできます。

1

メモリページを超えるとセグメンテーションフォールトが発生します。これは4kBなので、運が良ければ完全に4kを書き込むことができます。また、次のページがすでに利用されている場合でも保証されません。 Gccのスタックプロテクターは、時には助けになるかもしれませんが、その場合は役に立ちません。 Valgrindも助けることができました。これらのどれも保証されていません。あなたは自分でそれを世話してください。

0

メモリ領域の大きさを知り、それらの領域の外に書き込まないことで、この問題を回避できます。この問題に対処する他の信頼できる方法はありません。

+0

つまり、test1では、静的なchar cを静的なchar c [2]に変更できます。 p = cとする。すべてが同じままです。 – sunus

関連する問題