SORU
14 EKİM 2009, ÇARŞAMBA


'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:

  1. C FAQ: What's wrong with casting malloc's return value?
  2. SO: Should I explicitly cast malloc()’s return value?
  3. SO: Needless pointer-casts in C
  4. 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

  1. 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
  2. Against Casting (2012-02-14 olarak 404 hatası: 2010-01-27 kullanın. Internet Archive Wayback Machine kopya)

CEVAP
14 EKİM 2009, ÇARŞAMBA


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:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AlaskanGrizzly

    AlaskanGrizz

    30 EKİM 2009
  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • Hollyscoop

    Hollyscoop

    30 Ocak 2007