Articles of undefined behavior

La macro ‘offsetof’ di richiama un comportamento non definito?

Esempio dall’implementazione di MSVC: #define offsetof(s,m) \ (size_t)&reinterpret_cast((((s *)0)->m)) // ^^^^^^^^^^^ Come si può vedere, denota un puntatore nullo, che normalmente richiama un comportamento non definito. Questa è un’eccezione alla regola o cosa sta succedendo?

Qual è un modo corretto per digitare un float su un int e viceversa?

Il codice seguente esegue un’operazione di radice quadrata inversa rapida con alcuni hack. L’algoritmo è stato probabilmente sviluppato da Silicon Graphics nei primi anni ’90 ed è apparso anche in Quake 3. Ulteriori informazioni Tuttavia ricevo il seguente avviso dal compilatore GCC C ++ : il puntatore con punteria di tipo dereferencing interromperà le regole […]

Rilevamento dell’overflow firmato in C / C ++

A prima vista, questa domanda potrebbe sembrare un duplicato di Come rilevare l’overflow dei numeri interi? , tuttavia è in realtà significativamente diverso. Ho scoperto che mentre rilevando un overflow di interi non firmati è piuttosto banale, il rilevamento di un overflow con segno in C / C ++ è in realtà più difficile di […]

Dove esattamente lo standard C ++ dice che il dereferenziamento di un puntatore non inizializzato è un comportamento indefinito?

Finora non riesco a trovare come dedurre che quanto segue: int* ptr; *ptr = 0; è un comportamento indefinito. Prima di tutto, c’è il 5.3.1 / 1 che afferma che * indica l’indirezione che converte T* in T Ma questo non dice nulla di UB. Quindi viene spesso indicato 3.7.3.2/4 che dice che l’uso della […]

Comportamento non definito e punti di sequenza ricaricati

Considera questo argomento un seguito del seguente argomento: Rata precedente Comportamento non definito e punti di sequenza Rivediamo questa espressione divertente e contorta (le frasi in corsivo sono tratte dall’argomento * sorriso *): i += ++i; Diciamo che invoca un comportamento non definito. Presumo che quando dico questo, assumiamo implicitamente che il tipo di i […]

In che modo una variabile allo stesso indirizzo produce 2 valori diversi?

Considera questo: #include using namespace std; int main(void) { const int a1 = 40; const int* b1 = &a1; char* c1 = (char *)(b1); *c1 = ‘A’; int *t = (int*)c1; cout << a1 << " " << *t << endl; cout << &a1 << " " << t << endl; return 0; } L’output […]

Perché le espressioni costanti hanno un’esclusione per un comportamento non definito?

Stavo facendo ricerche su cosa è permesso in un’espressione costante di nucleo * , che è trattato nella sezione 5.19 Espressioni costanti, paragrafo 2 della bozza di standard C ++ che dice: Un’espressione condizionale è un’espressione costante di core a meno che non implichi una delle seguenti espressioni come sottoespressione potenzialmente valutata (3.2), ma sottoespressioni […]

Possiamo cambiare il valore di un object definito con const attraverso i puntatori?

#include int main() { const int a = 12; int *p; p = &a; *p = 70; } Funzionerà?

Il comportamento “struct hack” tecnicamente non definito?

Quello che sto chiedendo è il famoso trucco “last member of a struct has variable length”. Va qualcosa del genere: struct T { int len; char s[1]; }; struct T *p = malloc(sizeof(struct T) + 100); p->len = 100; strcpy(p->s, “hello world”); A causa del modo in cui la struttura è strutturata in memoria, siamo […]

Lo standard C ++ è cambiato rispetto all’uso di valori indeterminati e comportamento indefinito in C ++ 14?

Come indicato in L’inizializzazione comporta la conversione da lvalue a valore? È int x = x; UB? lo standard C ++ ha un sorprendente esempio nella sezione 3.3.2 Punto di dichiarazione in cui un int è inizializzato con il proprio valore indeterminato: int x = 12; { int x = x; } Qui la seconda […]