Accesso alla memoria non allineato: è definito comportamento o no?

Considera il seguente codice:

#include  int main() { char* c = new char('a'); char ac[4] = {'a', 'b', 'c', 'd'}; unsigned long long int* u = reinterpret_cast(c); unsigned long long int* uc = reinterpret_cast(&ac[3]); *u = 42; *uc = 42; std::cout<<*u<<" "<<*uc<<std::endl; } 

È considerato un codice valido o è una perdita di memoria / un comportamento indefinito? Sto chiedendo, perché attraverso:

 *u = 42; *uc = 42; 

stiamo accedendo ai byte che non dovrebbero essere raggiungibili dal programma (immagino).

*u = 42; causa un comportamento indefinito violando la regola di aliasing. *u è un lvalue di tipo unsigned long long , e la rigorosa regola di aliasing dice che questo può essere usato solo per accedere agli oggetti (che già esistono) e avere un tipo long long o unsigned long long . Tuttavia il tuo codice lo usa per accedere a un array di char .

C ++ non ha una regola specifica per gli accessi allineati (a differenza di C). Questo perché in C ++ non è ansible scrivere codice che esegua un accesso non allineato senza causare un comportamento indefinito a causa di una delle seguenti cose:

  • violare la rigida regola di aliasing.
  • accedere alla memoria dove non esiste alcun object.
  • fornendo un indirizzo non allineato al posizionamento nuovo.