問題は、私は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プログラミング経験を持っています。これが静的でないときに何が起こるかはわかっています。 静的にほとんどすべてが変わり、その理由を知りたい。
Shiftキーを使用すると、あなたの質問が読みやすくなります。 –
@Eric J:または、少なくとも適切に使用する方法を学んでください。 – BoltClock