Ist Zeigerarithmetik auf inaktives Mitglied einer Union UB?

8

Betrachten wir diesen Beispielcode:

%Vor%

In [basic.expr] wird angegeben, dass Zeigerarithmetik als zulässig ist Solange das Ergebnis auf ein anderes Element des Arrays zeigt (oder über das Ende eines Objekts oder des letzten Elements hinaus). Trotzdem ist in dieser Sektion nicht angegeben, was passiert, wenn das Array ein inaktives Mitglied einer Union ist. Ich glaube, es ist kein Problem short_str+15 ist nie UB. Ist es richtig?

Die folgende Frage zeigt deutlich meine Absicht

    
Oliv 10.01.2018, 13:40
quelle

1 Antwort

5

Wenn Sie return short_str+15; schreiben, nehmen Sie die Adresse eines Objekts, dessen Lebensdauer möglicherweise noch nicht begonnen hat. Dies führt jedoch nicht zu undefiniertem Verhalten, wenn Sie es nicht dereferenzieren.

  

[basic.life]/1.2

     

wenn das Objekt ein Union-Mitglied oder Unterobjekt davon ist,   Seine Lebensdauer beginnt erst, wenn dieses Union-Element initialisiert ist   Mitglied in der Union oder wie in [class.union] beschrieben.

und

  

[class.union]/1

     

In einer Union ist ein nicht statisches Datenelement aktiv, wenn dessen   Name bezieht sich auf ein Objekt, dessen Lebensdauer begonnen hat und nicht beendet ist   (%Code%). Höchstens einer der nicht statischen Datenelemente eines Objekts von   Der Union-Typ kann jederzeit aktiv sein, das heißt, der Wert von höchstens   eines der nicht statischen Datenelemente kann in einer beliebigen Union gespeichert werden   Zeit.

aber

  

[basic.life]

     

Bevor die Lebensdauer eines Objekts begonnen hat, aber nach dem Speichern der   Objekt wird besetzen wurde zugewiesen, oder nach der Lebensdauer eines   Objekt ist beendet und vor dem Speicher, den das Objekt belegt hat   wiederverwendet oder freigegeben, jeder Zeiger, der die Adresse des   Der Speicherort, an dem sich das Objekt befindet oder befand, kann verwendet werden   aber nur in begrenztem Umfang. Für ein Objekt im Bau oder   Zerstörung, siehe [basic.life]/6 . Andernfalls verweist ein solcher Zeiger auf allokiert   Speicher ( [class.cdtor] ) und den Zeiger verwenden, als ob der Zeiger von   Typ void *, ist gut definiert. Die Indirektion durch einen solchen Zeiger ist   erlaubt, aber der resultierende Wert kann nur begrenzt verwendet werden,   wie unten beschrieben.
  - [Liste ohne Bezug zu den Gewerkschaften]

    
YSC 10.01.2018, 14:01
quelle