In this thread la risposta più votata ha ricevuto molti voti e persino una taglia. Si propone il seguente algoritmo:Accesso alla stessa posizione di memoria due volte, UB o no?
void RemoveSpaces(char* source)
{
char* i = source;
char* j = source;
while(*j != 0)
{
*i = *j++; // UB?
if(*i != ' ')
i++;
}
*i = 0;
}
Il ginocchio reazione scatto era che questo codice invoca comportamento indefinito, perché i
e j
punto nella stessa posizione di memoria, e un'espressione come *i = *j++;
sarebbe poi accedere alla stessa variabile due volte, per altri scopi oltre a determinare cosa memorizzare, senza punti di sequenza intermedi. Anche se sono due variabili diverse, inizialmente puntano alla stessa posizione di memoria.
Tuttavia non ne sono sicuro, in quanto non vedo come i due accessi non sequenziati della stessa posizione di memoria possano causare danni alla pratica.
Sono corretto affermando che si tratta di un comportamento non definito? E se sì, ci sono esempi di come fare affidamento su tale UB potrebbe causare comportamenti dannosi?
EDIT
parte rilevante dello standard C che etichettare questo come UB è:
C99 6,5
Tra il precedente e successivo punto sequenza un oggetto deve avere il valore memorizzato modificato al massimo una volta dalla valutazione di un'espressione. Inoltre, il valore precedente deve essere letto solo per determinare il valore da memorizzare.
C11 6,5
Se un effetto collaterale su un oggetto scalare è non in sequenza rispetto a uno un effetto collaterale diverso sullo stesso oggetto scalare o un calcolo valore utilizzando il valore dello stesso oggetto scalare , il comportamento è indefinito. Se sono presenti più ordinamenti consentiti delle sottoespressioni di un'espressione, il comportamento non è definito se si verifica un effetto collaterale di questo tipo, in uno qualsiasi degli ordini.
Il significato effettivo del testo dovrebbe essere lo stesso in entrambe le versioni dello standard, ma credo che il testo C99 sia molto più facile da leggere e capire.
Ti ritrovi 'x = x;' discutibile, troppo? –
@KerrekSB Signore, ma questo caso è simile a 'x = x ++', non è vero? –
@NatashaDutta non lo è. –