Ist das unproblematisch?
-
Hi!
Ist es unproblematisch, wenn man sowas macht:
unsigned char* data = 0; unsigned long dataSize = 0; unsigned char newData[128]; memcpy(newData, data + 5, dataSize); // Egal?Könnte das crashen? Oder ist das egal? Da dataSize 0 ist, dürfte ja auch nichts dereferenziert werden, somit sollte das egal sein, nicht?
-
Laut Standard ist es nicht OK, weil du einen Zeiger auf etwas angreifst, was es nicht gibt. Er wird zwar nicht dereferenziert, aber es reicht schon dass er als Parameter übergeben wird.
Laut Standard dürfen Zeiger-Variablen deren Inhalt nicht auf ein gültiges Objekt* zeigt nur überschrieben werden (oder garnicht angesprochen) - alles andere ist nicht OK.
(Objekt ist hier ganz allgemein zu verstehen, schliesst auch Chars, Integers etc. mit ein)Soviel zum Standard.
Real ist es auf den Implementierungen die ich kenne unproblematisch.
-
Hi2 schrieb:
Ist es unproblematisch, wenn man sowas macht:
unsigned char* data = 0; unsigned long dataSize = 0; unsigned char newData[128]; memcpy(newData, data + 5, dataSize); // Egal?Könnte das crashen? Oder ist das egal? Da dataSize 0 ist, dürfte ja auch nichts dereferenziert werden, somit sollte das egal sein, nicht?
Ich bin mir nicht 100% sicher, aber ich glaube,
data+5führt zu undefiniertem Verhalten, da data ein Nullzeiger ist.data+0ist aber laut 5.7/7 (ISO C++ Standard) erlaubt und es gilt(data+0)==dataunabhängig davon, ob data ein Nullzeiger ist, oder auf etwas zeigt.Grundsätzlich ist es keine gute Idee mit Zeigern auf etwas zugreifen zu wollen, wo man nichts zu suchen hat. Zeigerarithmetik wird nur auf Arrays definiert, wobei die zwei Zeiger, die im Spiel sind, vom gleichen Array sein müssen (oder eins hinter das letzte Element zeigen):
int arr1[5]; int arr2[5]; int arr3[5]; int* p = arr2; p + 4; // OK p + 5; // OK p + 6; // nicht OK p[4]; // OK p[5]; // nicht OK p[6]; // nicht OKGruß,
SP