Im folgenden Code:Verletzt Pointer Casting wirklich das strikte Aliasing?
#include <stdio.h>
int main(void)
{
int n = 74;
int * pn = &n;
short * sp;
//sp = (short *)&n; // <-- bad
sp = (short *)pn; // <-- fine
*sp = 4;
printf("%d\n", *sp);
return 0;
}
ist die strenge Aliasing Regel gebrochen werden? Soweit ich es verstehe, tut es das, da ein Zeiger auf einen kurzen Punkt auf einen int zeigt. Aber der Compiler beschwert sich nicht selbst kompiliert, wenn sie mit (vorausgesetzt, der Code ist in test.c)
gcc test.c -o test.exe -Wall -std=c99 -Wstrict-aliasing=2 -O3
Es ist jedoch nicht beschweren, wenn die Linie markiert als schlecht unkommentiert ist, und der Computer markiert so fein ist kommentiert.
Kann jemand bitte erklären, ob dieser Fall wirklich die Regel bricht? Wenn ja, warum wird es vom Compiler nicht erkannt? Wenn nicht, warum nicht, denn nach dem Standard sollte es sein?
Compiler-Warnungen fangen nicht alles ein, selbst Dinge, die offensichtlich erscheinen. – user2357112
"der Compiler beschwert sich nicht" - willkommen in C, ohne ein Netz codieren. – chux
Wählen Sie eine Sprache. C und C++ haben hier leicht abweichende Regeln. – Lundin