Achtergrond
Veilig geheugen kopiëren is een van de meest voorkomende en kritieke taken in C. Aanvankelijk gebruikten programma's een lus voor byte-voor-byte kopiëren. Later zijn standaardfuncties toegevoegd: memcpy, memmove, en ook meer beveiligde alternatieven zoals strncpy voor strings. Onjuist kopiëren leidt tot buffer-overflow en kwetsbaarheden.
Probleem
Het gebruik van een ongeschikte functie of een onjuiste grootte bij kopiëren kan gegevens vernietigen of zelfs een pad openen voor kwaadwillenden. Het is essentieel om de gevallen te onderscheiden waarin memmove wordt gebruikt, en wanneer memcpy toegestaan is, om fouten met overlappende geheugengebieden te voorkomen.
Oplossing
Voor veilig kopiëren van niet-stringgeheugen, gebruik:
memcpy(dest, src, n);
memcpy kopieert snel n bytes van src naar dest, als hun geheugengebieden niet overlappen.memmove:memmove(dest, src, n);
Voor het kopiëren van strings gebruik je ofwel strncpy, of beter moderne en veiligere alternatieven, indien beschikbaar (strlcpy).
Belangrijke kenmerken:
memcpy is alleen veilig bij afwezigheid van overlapping tussen src en dest.memmove werkt correct, zelfs met overlappende geheugengebieden.1. Wat is het verschil tussen memcpy en memmove, en wanneer is welke functie nodig?
memcpy werkt erg snel, maar is niet bedoeld voor overlappende geheugengebieden — het resultaat wordt onvoorspelbaar. memmove garandeert correcte kopieën, ongeacht overlapping:
int arr[] = {1,2,3,4,5}; // memmove: veilig kopiëren met overlapping memmove(arr+1, arr, 4 * sizeof(int));
2. Is het veilig om strcpy te gebruiken voor het kopiëren van een string naar een kleinere buffer?
Nee, de functie strcpy controleert niet de grootte van de bestemmingsbuffer. Dit leidt vaak tot buffer-overflow. Het is beter om strncpy of strlcpy (als beschikbaar) te gebruiken, of de grootte expliciet te controleren:
char dest[5]; strncpy(dest, src, sizeof(dest)-1); // src moet korter zijn dan 5 tekens
3. Kan memcpy worden gebruikt voor het kopiëren van structuren met pointers?
Ja, maar dit kopieert alleen de pointers zelf, niet de gegevens op die adressen. Dit kan leiden tot geheugenfouten en dubbele vrijgaven.
Een lange string wordt gekopieerd naar een kleine buffer met strcpy zonder de lengte van de bron te controleren. Dit leidt tot buffer-overflow, wat resulteert in een kwetsbaarheid.
Voordelen:
Nadelen:
strncpy of memmove wordt gebruikt met nauwkeurige controle over de grootte, en handmatig wordt de terminator van de string verzekerd.
Voordelen:
Nadelen: