memset, memset_explicit, memset_s
Von cppreference.com
| Definiert in Header <string.h> |
||
| void *memset( void *dest, int ch, size_t count ); |
(1) | |
| void *memset_explicit( void *dest, int ch, size_t count ); |
(2) | (seit C23) |
| errno_t memset_s( void *dest, rsize_t destsz, int ch, rsize_t count ); |
(3) | (seit C11) |
1) Kopiert den Wert (unsigned char)ch in jedes der ersten
count Zeichen des durch dest zeigenden Objekts. Der Zugriff über das Ende des dest-Arrays hinaus ist undefiniertes Verhalten. Ein Nullzeiger für
dest führt zu undefiniertem Verhalten.2) Identisch mit (1), jedoch sicher für sensible Informationen.
3) Identisch mit (1), mit der Ausnahme, dass die folgenden Fehler zur Laufzeit erkannt werden und nach dem Speichern von
ch an jeder Position des Zielbereichs [dest, dest+destsz) die aktuell installierte Constraint-Handler-Funktion aufrufen, falls dest und destsz selbst gültig sind-
destist ein Nullzeiger -
destszodercountist größer als RSIZE_MAX -
countist größer alsdestsz(Pufferüberlauf würde auftreten)
-
Das Verhalten ist undefiniert, wenn die Größe des durch
dest zeigenden Zeichen-Arrays < count <= destsz ist; anders ausgedrückt, ein fehlerhafter Wert von destsz deckt den bevorstehenden Pufferüberlauf nicht auf.- Wie bei allen grenzgeprüften Funktionen ist
memset_snur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <string.h> auf die ganzzahlige Konstante 1 setzt.
Inhalt |
[edit] Parameter
| dest | - | Zeiger auf das zu füllende Objekt |
| ch | - | Füllbyte |
| zählt | - | Anzahl der zu füllenden Bytes |
| destsz | - | Größe des Ziel-Arrays |
[edit] Rückgabewert
1,2) Eine Kopie von
dest3) Null bei Erfolg, ungleich Null bei einem Fehler. Bei einem Fehler, wenn
dest kein Nullzeiger ist und destsz gültig ist, werden destsz Füllbytes ch in das Ziel-Array geschrieben.[edit] Hinweise
memset kann (gemäß den as-if-Regeln) wegoptimiert werden, wenn das von dieser Funktion modifizierte Objekt für den Rest seiner Lebensdauer nicht mehr zugegriffen wird (z.B. gcc bug 8537). Aus diesem Grund kann diese Funktion nicht zum Scrubben von Speicher (z.B. zum Auffüllen eines Arrays, das ein Passwort enthielt, mit Nullen) verwendet werden.
Diese Optimierung ist für memset_explicit und memset_s untersagt: sie garantieren die Durchführung der Speicherbeschreibungen.
Drittanbieterlösungen dafür umfassen FreeBSD explicit_bzero oder Microsoft SecureZeroMemory.
[edit] Beispiel
Führen Sie diesen Code aus
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char str[] = "ghghghghghghghghghghgh"; puts(str); memset(str,'a',5); puts(str); #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s); int r = memset_s(str, sizeof str, 'b', 5); printf("str = \"%s\", r = %d\n", str, r); r = memset_s(str, 5, 'c', 10); // count is greater than destsz printf("str = \"%s\", r = %d\n", str, r); #endif }
Mögliche Ausgabe
ghghghghghghghghghghgh aaaaahghghghghghghghgh str = "bbbbbhghghghghghghghgh", r = 0 str = "ccccchghghghghghghghgh", r = 22
[edit] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 7.24.6.1 The memset function (S. 270)
- K.3.7.4.1 The memset_s function (S. 451)
- C11-Standard (ISO/IEC 9899:2011)
- 7.24.6.1 The memset function (S. 371)
- K.3.7.4.1 The memset_s function (S. 621-622)
- C99-Standard (ISO/IEC 9899:1999)
- 7.21.6.1 The memset function (S. 333)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.11.6.1 The memset function
[edit] Siehe auch
| (C11) |
kopiert einen Puffer in einen anderen (Funktion) |
| (C95) |
kopiert das gegebene breite Zeichen in jede Position eines breiten Zeichen-Arrays (Funktion) |
| C++ Dokumentation für memset
| |