set_constraint_handler_s, constraint_handler_t
| Definiert im Header <stdlib.h> |
||
| constraint_handler_t set_constraint_handler_s( constraint_handler_t handler ); |
(1) | (seit C11) |
| typedef void (*constraint_handler_t)( const char* restrict msg, void* restrict ptr, |
(2) | (seit C11) |
Wenn set_constraint_handler_s nie aufgerufen wird, ist der Standard-Handler implementierungsdefiniert: Es kann abort_handler_s, ignore_handler_s oder ein anderer implementierungsdefinierter Handler sein.
Wie bei allen grenzgeprüften Funktionen sind set_constraint_handler_s und constraint_handler_t nur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <stdlib.h> auf die Ganzzahlkonstante 1 setzt.
Inhalt |
[bearbeiten] Parameter
| handler | - | Zeiger auf eine Funktion vom Typ constraint_handler_t oder ein Nullzeiger |
| msg | - | Zeiger auf eine Zeichenkette, die den Fehler beschreibt |
| ptr | - | Zeiger auf ein implementierungsdefiniertes Objekt oder einen Nullzeiger. Beispiele für implementierungsdefinierte Objekte sind Objekte, die den Namen der Funktion, die die Verletzung erkannt hat, und die Zeilennummer, zu der die Verletzung erkannt wurde, angeben. |
| error | - | der von der aufrufenden Funktion zurückzugebende Fehler, falls es sich um eine der Funktionen handelt, die errno_t zurückgeben |
[bearbeiten] Rückgabewert
Ein Zeiger auf den zuvor installierten Laufzeit-Constraint-Handler. (Hinweis: Dieser Zeiger ist niemals ein Nullzeiger, da der Aufruf von set_constraint_handler_s(NULL) den Systemstandard-Handler einrichtet).
[bearbeiten] Beispiel
#define __STDC_WANT_LIB_EXT1__ 1 #include <string.h> #include <stdio.h> #include <stdlib.h> int main(void) { #ifdef __STDC_LIB_EXT1__ char dst[2]; set_constraint_handler_s(ignore_handler_s); int r = strcpy_s(dst, sizeof dst, "Too long!"); printf("dst = \"%s\", r = %d\n", dst, r); set_constraint_handler_s(abort_handler_s); r = strcpy_s(dst, sizeof dst, "Too long!"); printf("dst = \"%s\", r = %d\n", dst, r); #endif }
Mögliche Ausgabe
dst = "", r = 22 abort_handler_s was called in response to a runtime-constraint violation. The runtime-constraint violation was caused by the following expression in strcpy_s: (s1max <= (s2_len=strnlen_s(s2, s1max)) ) (in string_s.c:62) Note to end users: This program was terminated as a result of a bug present in the software. Please reach out to your software's vendor to get more help. Aborted
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- K.3.6/2 constraint_handler_t (S. TBD)
- K.3.6.1.1 Die Funktion set_constraint_handler_s (S. TBD)
- C17-Standard (ISO/IEC 9899:2018)
- K.3.6/2 constraint_handler_t (S. TBD)
- K.3.6.1.1 Die Funktion set_constraint_handler_s (S. TBD)
- C11-Standard (ISO/IEC 9899:2011)
- K.3.6/2 constraint_handler_t (S. 604)
- K.3.6.1.1 Die Funktion set_constraint_handler_s (S. 604-605)
[bearbeiten] Siehe auch
| (C11) |
Abbruch-Callback für die grenzgeprüften Funktionen (Funktion) |
| (C11) |
Ignorier-Callback für die grenzgeprüften Funktionen (Funktion) |