Il seguente codice in C ha un comportamento definito?La rimozione di const da un puntatore a const obbedisce a un aliasing rigoroso in C e si riferisce allo stesso oggetto?
int main() {
const int i = 0;
return *(int*)(&i);
}
Lo chiedo perché 6,5/7 elenca "una versione qualificato di un tipo compatibile con il tipo effettivo dell'oggetto" come alias valido. Ma il tipo effettivo dell'oggetto è const int
e non penso che sia una versione qualificata di const int
(sebbene sia vero il contrario). Né sono compatibili int
e const int
(6.7.3/10).
Inoltre, 6.3.2.3/2 indica che è possibile convertire i tipi di puntatore da aggiungendo i qualificatori e che il puntatore risultante è uguale. 6.3.2.3/7 afferma che è possibile convertire qualsiasi tipo di puntatore (quindi è consentito il cast (int*)(&i)
). Ma non dice che il puntatore risultante si riferisce allo stesso oggetto o anche che è uguale. Tutto ciò che dice è che può essere riconvertito al tipo originale (in questo caso const int*
). Cioè, anche se l'alias è legale, non è chiaro per me che lo standard garantisce che la mia conversione puntatore abbia effettivamente come risultato un puntatore che si riferisce a i
.
Quindi, lo standard definisce effettivamente il comportamento del mio codice e, in caso affermativo, dove è definito?
Sono consapevole che il codice funziona in pratica. Ho in mente un'ipotetica (e bizzarra) implementazione su cui non funziona. Potrei chiedere se tale implementazione è conforme allo standard (e se no, quale parte viola), ma non voglio confondere le acque se ci sono altri aspetti in cui la mia implementazione immaginata non riesce a conformarsi. Descriverò l'implementazione se qualcuno pensa che li aiuterà a rispondere alla domanda.
Per il cast ritorna a 'int const *' lo standard è chiaro che il risultato deve essere l'identità. "Altrimenti, una volta convertito nuovamente, il risultato deve essere paragonato al puntatore originale ." –
@JensGustedt: concordato. Questo non aiuta il mio codice, perché il mio codice non lo restituisce mai a 'int const *'. –