'in malloc sonucu döküm hakkında daha tehlikeli ne özellikle?
Şimdi insanlar bu dup işaretleme başlamadan önce, hiçbiri aradığım cevap vermek tüm aşağıdaki okudum:
- C FAQ: What's wrong with casting malloc's return value?
- SO: Should I explicitly cast malloc()’s return value?
- SO: Needless pointer-casts in C
- SO: Do I cast the result of malloc?
Hem C SSS ve birçok cevaplar yukarıdaki sorular alıntı gizemli bir hata döküm malloc
'nın dönüş değeri değiştirmek için; ancak, hiçbiri verin spesifik bir örnek böyle bir hata uygulama. Şimdi öde dedim dikkathatadeğiluyarı.
Şimdi aşağıdaki kodu verilir
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Gcc ve dökme olmadan 4.2, yukarıdaki kod derleniyor aynı uyarı verir ve program düzgün çalıştırır ve her iki durumda da aynı sonucu sağlar.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
Bu yüzden herkes döküm nedeniyle oluşan derleme veya çalışma zamanı hatası belirli bir kod örneği vermek malloc
'nın dönüş değeri, yoksa bu sadece bir şehir efsanesi mi? olabilir
Editİyi argümanlar bu konu ile ilgili yazılan: iki tanesini buldum
- Döküm Lehine: CERT Danışmanlık: Immediately cast the result of a memory allocation function call into a pointer to the allocated type
- Against Casting (2012-02-14 olarak 404 hatası: 2010-01-27 kullanın. Internet Archive Wayback Machine kopya)
CEVAP
Bir şansın olmayacakderleyici hataama birderleyici uyarı. Kaynakları söylüyorsun (first one özellikle) alıntı olarakolabilirbir tahmin edilemezçalışma zamanı hatasıcast kullanırkenstdlib.h
dahil olmadan.
Yani kendi tarafında hata dökme değil, ama stdlib.h
eklemeyi unutma. Derleyiciler olabilir varsayalım malloc
fonksiyon dönüş int
, Bu nedenle dönüştürme void*
işaretçi aslında döndü malloc
int
ve sonra sizin işaretçi tipi nedeniyle açık dökme. Bazı platformlarda int
ve işaretçi tip dönüşümleri veri bozulmasına neden olabilir, bu yüzden bayt farklı sayı alabilir.
Neyse ki, modern Derleyiciler gerçek hata uyarıları bu puan verin. Sağladığınız gcc
çıkış:. konusunda uyarıyor ^em>örtülübeyanname (int malloc(int)
)-inşa malloc
uyumsuz. gcc
stdlib.h
bile olmadan malloc
biliyor gibi görünüyor.
Bu hatayı önlemek için oyuncuları dışarıda bırakarak çoğunlukla yazılı olarak aynı mantık
if (0 == my_var)
yerine
if (my_var == 0)
ikincisi ise bir =
ve ilk ise ==
, kafasını eğer ciddi bir hata neden olabilir beri bir derleme hatası neden olur. Ben şahsen daha iyi niyetim yansıtır ve bu hata yapmaya meyilli değilim beri ikinci tarzını tercih ederim.
Açık programlamada tercih ederim ve ben genellikle çift kontrol kullanın tüm fonksiyonları için başlık dosyalarını dahil etmek için. aynı değeri malloc
tarafından döndürülen döküm için de geçerlidir:
Malloc sonucu dökme muyum?...
ne kadar eski bir git-commit (ve git h...
Yöntemde bir değişiklik dönen yüzer yü...
İzleme ya da böyle büyük mükafat/özel ...
Neden malloc calloc memset daha yavaşt...