Ich habe verschiedene Beiträge zu Stack Overflow RE gelesen : Der dereferenzierende typgesteuerte Zeigerfehler. Nach meinem Verständnis ist der Fehler im Wesentlichen die Compiler-Warnung vor der Gefahr des Zugriffs auf ein Objekt über einen Zeiger eines anderen Typs (obwohl eine Ausnahme gemacht zu sein scheint char*
), was eine verständliche und vernünftige Warnung ist.
Meine Frage bezieht sich speziell auf den folgenden Code: Warum qualifiziert sich das Umwandeln der Adresse eines Zeigers auf eine void**
für diese Warnung (über Fehler zum Fehler befördert -Werror
)?
Darüber hinaus wird dieser Code für mehrere Zielarchitekturen kompiliert, von denen nur eine die Warnung / den Fehler generiert. Könnte dies bedeuten, dass es sich zu Recht um einen compilerspezifischen Mangel des Compilers handelt?
// 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;
}
Wenn mein oben angegebenes Verständnis richtig ist und a void**
immer noch nur ein Zeiger ist, sollte dies ein sicheres Casting sein.
Gibt es eine Problemumgehung , bei der keine l-Werte verwendet werden , um diese compilerspezifische Warnung / diesen Fehler zu beruhigen? Dh ich verstehe das und warum dies das Problem lösen wird, aber ich möchte diesen Ansatz vermeiden, weil ich die freeFunc()
NULL eines beabsichtigten Out-Arg nutzen möchte :
void* tmp = f;
freeFunc( &tmp );
f = NULL;
Problem Compiler (einer von einem):
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$
Nicht beschwerender Compiler (einer von vielen):
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$
Update: Ich habe außerdem festgestellt, dass die Warnung beim Kompilieren speziell generiert zu werden scheint -O2
(immer noch nur mit dem angegebenen "Problem-Compiler").
void**
, da dies immer noch nur ein Zeiger ist, sollte dies ein sicheres Casting sein." Woah da skippy! Klingt so, als hätten Sie einige grundlegende Annahmen. Versuchen Sie, weniger in Bytes und Hebeln als in Abstraktionen zu denken, denn damit programmieren Sie tatsächlich