Nach N1570 6,5/6:jede Compilern Übertragungs wirksame Art durch Memcpy/memmove
Wenn ein Wert in ein Objekt kopiert wird, das keine deklarierten Typ unter Verwendung Memcpy oder memmove oder kopiert wird als ein Array von Zeichentyp, 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, wenn es einen Wert hat.
, dass diese auch auf einem System vorschlagen würde, wo „lang“ und einige andere Integer-Typ die gleiche Darstellung haben, würde die folgende undefinierten Verhalten aufrufen:
#if ~0UL == ~0U
#define long_equiv int
#elif ~0UL == ~0ULL
#define long_equiv long long
#else
#error Oops
#endif
long blah(void)
{
long l;
long_equiv l2;
long_equiv *p = malloc(sizeof (long));
l = 1234;
memcpy(p, &l, sizeof (long));
l2 = *p;
free(p); // Added to address complaint about leak
return l2;
}
da die Daten darauf durch l
deutlich hat effektiven Typ long
und das Objekt, auf das von verwiesen wird, hat keinen deklarierten Typ, der memcpy
sollte den effektiven Typ des Speichers auf long
setzen. Da das Lesen eines lval vom Typ long_equiv
zum Lesen eines Objekts mit dem effektiven Typ long
nicht zulässig ist, ruft der Code Undefined Behavior auf.
Vorausgesetzt, dass vor C99 memcpy
eine der Standardmethoden zum Kopieren von Daten eines Typs in Speicher eines anderen Typs war, verursachen die neuen Regeln über memcpy
viel vorhandenen Code zum Aufrufen von Undefined Behavior. Wenn die Regel stattdessen gewesen wäre, dass die Verwendung von memcpy
zum Schreiben in zugewiesenen Speicher das Ziel ohne einen effektiven Typ verlässt, wird das Verhalten definiert.
Gibt es Compiler, die die effektive Art des Ziel ungesetzt, wenn sie zum Kopieren von Daten zu zugewiesenen Speicher nicht verhalten, als ob memcpy
verlässt, oder sollte von memcpy
zum Zwecke der Daten Übersetzung in Betracht gezogen werden „sicher“ nutzen? Wenn einige Compiler einen effektiven Typ der Quelle auf das Ziel anwenden, was wäre die richtige Art, Daten in typenunabhängiger Weise zu kopieren? Was ist mit "als Array von Zeichentypen kopiert" gemeint?
Ihr Code ruft bereits UB auf, weil Sie nicht 'frei (p)', aber den Zeiger auf Rückkehr verlieren. Dein Punkt ist nicht ganz klar. IIRC, es war bereits UB in C89, einen Typ auf eine andere Art zu kopieren. Es ist einfach passiert und funktioniert wahrscheinlich immer noch. Der effektive Typ wird vom Compiler nicht "angewendet", sondern angenommen. Wie "const" qualifizierte Objekte garantiert der Programmierer dies und der Compiler verlässt sich darauf. Für den letzten Satz lesen Sie bitte die Beschreibung von 'memmove' &' memcpy'. Sie sollen 'char'-weise kopieren. – Olaf
Meinst du '~ 0UL'? Weil "~ 0", "~ 0L" und "~ 0LL" im Zweierkomplement alle "-1" sind und alle gleich sind, unabhängig von der Darstellungsgröße –
@Olaf: Ein Speicherleck ist kein undefiniertes Verhalten. –