Saya telah membaca berbagai posting di Stack Overflow RE: kesalahan pointer-jenis dihukum-derefercing. Pemahaman saya adalah bahwa kesalahan pada dasarnya adalah peringatan kompiler dari bahaya mengakses suatu objek melalui pointer dari tipe yang berbeda (meskipun pengecualian tampaknya dibuat untuk char*
), yang merupakan peringatan yang dapat dimengerti dan masuk akal.
Pertanyaan saya khusus untuk kode di bawah ini: mengapa tidak memasukkan alamat penunjuk ke void**
kualifikasi untuk peringatan ini (dipromosikan ke kesalahan melalui -Werror
)?
Selain itu, kode ini dikompilasi untuk beberapa arsitektur target, hanya satu yang menghasilkan peringatan / kesalahan - mungkinkah ini menyiratkan bahwa itu adalah defisiensi khusus versi kompiler?
// main.c
#include <stdlib.h>
typedef struct Foo
{
int i;
} Foo;
void freeFunc( void** obj )
{
if ( obj && * obj )
{
free( *obj );
*obj = NULL;
}
}
int main( int argc, char* argv[] )
{
Foo* f = calloc( 1, sizeof( Foo ) );
freeFunc( (void**)(&f) );
return 0;
}
Jika pemahaman saya, yang dinyatakan di atas, benar, a void**
, karena masih hanya sebuah pointer, ini harus menjadi casting yang aman.
Apakah ada solusi untuk tidak menggunakan nilai yang akan menenangkan peringatan / kesalahan khusus kompiler ini? Yaitu saya mengerti itu dan mengapa ini akan menyelesaikan masalah, tetapi saya ingin menghindari pendekatan ini karena saya ingin mengambil keuntungan dari freeFunc()
NULL ing out-arg yang dimaksudkan:
void* tmp = f;
freeFunc( &tmp );
f = NULL;
Penyusun masalah (salah satunya):
user@8d63f499ed92:/build$ /usr/local/crosstool/x86-fc3/bin/i686-fc3-linux-gnu-gcc --version && /usr/local/crosstool/x86-fc3/bin/i686-fc3-linux-gnu-gcc -Wall -O2 -Werror ./main.c
i686-fc3-linux-gnu-gcc (GCC) 3.4.5
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
./main.c: In function `main':
./main.c:21: warning: dereferencing type-punned pointer will break strict-aliasing rules
user@8d63f499ed92:/build$
Kompiler tidak mengeluh (salah satu dari banyak):
user@8d63f499ed92:/build$ /usr/local/crosstool/x86-rh73/bin/i686-rh73-linux-gnu-gcc --version && /usr/local/crosstool/x86-rh73/bin/i686-rh73-linux-gnu-gcc -Wall -O2 -Werror ./main.c
i686-rh73-linux-gnu-gcc (GCC) 3.2.3
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
user@8d63f499ed92:/build$
Pembaruan: Saya menemukan bahwa peringatan tampaknya dihasilkan secara khusus ketika dikompilasi dengan -O2
(masih dengan "problem compiler" yang dicatat saja)
void**
, karena masih hanya sebuah pointer, ini seharusnya menjadi casting yang aman." Woah ada lendir! Sepertinya Anda memiliki beberapa asumsi mendasar yang sedang terjadi. Cobalah untuk berpikir lebih sedikit dalam hal byte dan tuas dan lebih banyak dalam hal abstraksi, karena itulah yang sebenarnya Anda pemrograman dengan