#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo() {
char *a_heap_pointer;
a_heap_pointer = (char*)malloc(1 * sizeof(char));
strcpy(a_heap_pointer, "a");
printf("%s\n", a_heap_pointer);
while (1){
++a_heap_pointer;
a_heap_pointer = (char*)malloc(1 * sizeof(char));
strcpy(a_heap_pointer, "b");
printf("%s\n", a_heap_pointer);
}
}
int main (void) {
foo();
return 0;
}
こんにちは、私はCプログラムがヒープをポイントするポインタをインクリメントしてセグメンテーション違反を起こさせようとしています。プログラムがクラッシュするまでしかし、私のコードは今のところ無期限に走っています。私は、ヒープが非常に大きいので、それがそれを実行するためにしばらく時間がかかるだろうと推測します。私のプログラムはヒープを壊すことができますか?Heapcrash - segフォールトによる増分ヒープを指すポインタ
アセンブリを見ましたか? strcpyの呼び出しは、2文字を1文字の長さのバッファにコピーすると、すでに定義されていない動作のようです。コンパイラはこれを単純に無限ループに最適化することができます。 – HeroicKatora
また、 'a_heap_pointer = ...'の直後にある '++ a_heap_pointer'は、インクリメントをノーオペレーションにするので、コンパイラのフラグに依存して、完全に離れて最適化できます。副作用のないコードです。 – twalberg