Derleyicileri optimize etme dünyasına hoş geldiniz!
As-if kuralı nedeniyle, derleyici yalnızca orijinal kodunuzla aynı gözlenebilir sonuçları olan bir şey oluşturmak için gereklidir. ücretsiz eğer Yani derleyici:
- kullanılmayan diziler kaldırmak
- boş döngü bacanın ana dışarıdan dinamik diziler
- mağaza kaldırmak - Ana sadece denecek özel fonksiyon olduğu için bir kez çevre
Eğer yığın taşması gözlemlemek istiyorsanız (kötü biri değil bizim güzel bir site :-)), yapmanız gerekir göre:
- Ben kadar doğru olabildiğince yazdıklarını yapmak derleyici anlatmak için
- kaldırıldı bütün optimizasyonu ile ve preferently ayıklama modunda derleme diziler doldurmak için bazı kodlar kullanmak
Aşağıdaki kod ile SIGSEGV yapar clang 3.4.1 cc -g foo.c -o foo
#include <stdio.h>
#define SIZE 88388608
void fill(int *arr, size_t size, int val) {
for (size_t i=0; i<size; i++) {
arr[i] = val;
}
}
int main() {
int arr[SIZE];
int arr1[SIZE];
int arr2[SIZE];
fill(arr, SIZE, 0);
fill(arr1, SIZE, 0);
fill(arr2, SIZE, 0);
printf("%d %d %d\n", arr[12], arr1[15], arr2[18]);
return 0;
}
olarak derlenmiş ve -O2
optimizasyon seviyesi olarak derlenmiş bile bu kod çalışıyor iken ... Derleyiciler şimdi şunlardır Benim için zekice, ve gerçekten neyin yürütüldüğünü anlamanın tek gerçek yolu olacak derleme kurallarına iyice bakmaya yetecek kadar cesur değilim!
Yığını taşırken, * beklendiği gibi çalışabilen * tanımlanmamış davranış * elde edersiniz. Ayrıca, bu günlerde derleyiciler oldukça zekiler. Bu diziler kullanılmadığından derleyici neden onlar için alan yaratmalı? –
"int" 'den "volatile int"' ye arr türünü değiştirdiğinizde ne olur? –
Ayrıca, AFAIK, yığının boyutu farklı sistemlere göre değişebilir. –