Articles of undefined behavior

Perché è un comportamento indefinito eliminare un array di oggetti derivati ​​tramite un puntatore di base?

Ho trovato il seguente snippet nello standard C ++ 03 in 5.3.5 [expr.delete] p3 : Nella prima alternativa ( delete object ), se il tipo statico dell’object da cancellare è diverso dal suo tipo dinamico, il tipo statico deve essere una class base del tipo dinamico dell’operando e il tipo statico deve avere un distruttore […]

Perché l’ottimizzatore GCC 6 ottimizzato rompe il pratico codice C ++?

GCC 6 ha una nuova funzione di ottimizzazione : presuppone che this sia sempre nullo e ottimizzato in base a ciò. La propagazione dell’intervallo di valori ora presuppone che questo puntatore delle funzioni membro C ++ non sia null. Ciò elimina i comuni controlli dei puntatori nulli, ma interrompe anche alcuni code-base non conformi (come […]

Distruttore virtuale e comportamento indefinito

Questa domanda è diversa da ‘ Quando / perché dovrei usare un distruttore virtual ? ‘. struct B { virtual void foo (); ~B() {} // <— not virtual }; struct D : B { virtual void foo (); ~D() {} }; B *p = new D; delete p; // D::~D() is not called Domande […]

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 […]