2016-04-24 23 views
7

Sorunun basit olması, GCC'ye ayrılan bir bloğu serbest bırakmazsam uyarılmasını istediğimi söylemenin bir yolu var mı? Bazı amaçlar için özgür olmayan bloklara sahip olabileceğimizi/programın sonuna ulaştığımızı veya böyle bir şeye sahip olduğumuzu biliyorum.GCC, serbest olmayan yığın blokları için uyarıyor

int main(){ 
    int *a = malloc(sizeof(int)); 
    return 0; 
} 

Bunun için bir uyarı bile alabilirsem harika olurdu.

+4

GCC? Tabii ki değil. Valgrind yes – Idos

+0

@Idos Valgrind'in kontrol edebileceğini biliyorum, ancak uyarıları kazadan önce almak için bir yol olsaydı gerçekten harika olurdu. –

cevap

3

GCC'nin yapması olası bir iş değildir. Statik analiz, bir serbestliğin unutulduğunu ispatlayamaz, bu, valgrind's memcheck gibi çalışma zamanı analizörlerinin işi veya , yani , sadece clang -fsanitize=leak ile görmedim.

Ancak, gcc veya clang desteklediğinde bile derleme zamanı uyarısı almayacaksınız. Bir çalışma zamanı uyarısı olacak.

+0

Ancak, çalışma zamanı her durum için biraz farklı değil. Bu, kanıtlanmış olamaz çünkü programın tüm durumlarını kontrol etmek için çok fazla zaman isterdi? –

+0

'-fsanitize = leak' sadece bir optimizasyon, AFAIK sadece gcc ile iyi çalışan' -fsanitize = address' ile derleyebilirsiniz. –

+0

Yakup: Evet, çalışma zamanı sadece keşfedilmemiş olanları değil, testsuitlerdeki sızıntıları yakalayacaktır. Marc: -fsanitize = adres gerçekten bir sızıntı yakalamayacak, -fsanitize = bellek yok, ancak sızıntı ve valgrind en iyisidir. – rurban

2

Derleyici serbest olmayan blokları öngöremez ve uyarmaz. Bu çalışma zamanı işi, zamanı derleme değil. Kendi malloc-free-check alt sisteminizi uygulayabilir veya bellek yönetim kütüphanesini değiştirebilirsiniz.

+0

Bir derleyicinin belleğin yığından ayrılıp ayrılmadığını kontrol edemediğini biliyorum, ancak "yığın ayırma işlevleri" tarafından kullanılan bir özellik olacağını öğrettim. Bu mümkün olurdu. –

+0

Sanırım bellek yönetiminin tanısal uygulamaları var. Tahsis edilen programdaki ('malloc ile) adres için tahsis edilen her bloğa fazladan bilgi verilmelidir. Ardından, tüm serbest bırakılmamış blokları tarayan program sonlandırma işleminde bazı '_mem_leak' işlevini çağırabilirsiniz. – i486