Kann ein Objekt mehr als einen effektiven Typ haben?

Betrachten Sie den folgenden Code auf einer Plattform, auf der die ABI keine Auffüllungen in Gewerkschaften einfügt:

union { int xi; } x;
x.xi = 1;

Ich glaube, dass die zweite Zeile undefiniertes Verhalten aufweist, da sie die strikte Aliasing-Regel verletzt:

Das Objekt, auf das @ verweix.xi ist dasselbe Objekt wie das Objekt, auf das @ verweix. Beide sind dieselbe Speicherregion und der BegriffObjek ist in ISO 9899: 2011 §3.15 definiert als:

Objek

1 Datenspeicherbereich in der Ausführungsumgebung, dessen Inhalt Werte darstellen kann

2 HINWEIS Wenn auf ein Objekt verwiesen wird, kann es so interpretiert werden, dass es einen bestimmten Typ hat. siehe 6.3.2.1.

Da ein Objekt nicht mehr als eine Speicherregion ist, schließe ich, dass alsx undx.xi belegen den gleichen Speicher, sie sind das gleiche Objekt.

Daseffektiver Typ vonx istunion { int xi; } da dies der Typ ist, mit dem es deklariert wurde. Siehe §6.5 ¶6:

6 DasWirksa Typ eines Objekts für den Zugriff auf seinen gespeicherten Wert ist der deklarierte Typ des Objekts, falls vorhanden. 87) Wenn ein Wert in einem Objekt ohne deklarierten Typ über einen Wert mit einem Typ gespeichert wird, der kein Zeichentyp ist, wird der Typ des Werts zum effektiven Typ des Objekts für diesen Zugriff und für nachfolgende Zugriffe, die nicht geändert werden der gespeicherte Wert. Wenn ein Wert mit @ in ein Objekt ohne deklarierten Typ kopiert wimemcpy odermemmove oder wird als Array des Zeichentyps kopiert, dann ist der effektive Typ des geänderten Objekts für diesen Zugriff und für nachfolgende Zugriffe, die den Wert nicht ändern, der effektive Typ des Objekts, von dem der Wert kopiert wird, falls vorhanden einer. Bei allen anderen Zugriffen auf ein Objekt ohne deklarierten Typ ist der effektive Typ des Objekts einfach der Typ des für den Zugriff verwendeten Werts.

87) Zugeordnete Objekte haben keinen deklarierten Typ.

urch den Wortlaut von ¶6 ist auch klar, dass jedes Objekt nur einen effektiven Typ haben kann.

In der Anweisungx.xi Ich greife auf @ x durch den lvaluex.xi getipptint. Dies ist kein Typ aus §6.5 ¶7:

7 Auf den gespeicherten Wert eines Objekts darf nur mit einem Werteausdruck eines der folgenden Typen zugegriffen werden: 88)

ein Typ, der mit dem effektiven Typ des Objekts kompatibel ist, eine qualifizierte Version eines Typs, der mit dem effektiven Typ des Objekts kompatibel ist, ein Typ, der der vorzeichenbehaftete oder vorzeichenlose Typ ist, der dem effektiven Typ des Objekts entspricht, ein Typ, der der vorzeichenbehaftete oder vorzeichenlose Typ ist, der einer qualifizierten Version des effektiven Typs des Objekts entspricht,ein Aggregat- oder Vereinigungstyp, der einen der oben genannten Typen unter seinen Mitgliedern enthält (einschließlich rekursiv eines Mitglieds eines Unteraggregats oder einer enthaltenen Vereinigung), oder ein Zeichentyp.

88) Mit dieser Liste sollen die Umstände angegeben werden, unter denen ein Objekt einen Alias aufweisen kann oder nicht.

Daher zeigt die zweite Zeile undefiniertes Verhalten.

Als diese Interpretation eindeutig falsch ist, wo liegt mein Missverständnis des Standards?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage