Namensräume
Varianten
Aktionen

set_constraint_handler_s, constraint_handler_t

Von cppreference.com
< c‎ | error
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,

                                      errno_t error );
(2) (seit C11)
1) Konfiguriert den Handler, der von allen grenzgeprüften Funktionen bei einer Laufzeit-Constraint-Verletzung aufgerufen wird, oder stellt den Standard-Handler wieder her (wenn handler ein Nullzeiger ist).
2) Der Zeiger auf einen Handler, der bei einer Laufzeit-Constraint-Verletzung aufgerufen wird.

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

Abbruch-Callback für die grenzgeprüften Funktionen
(Funktion) [bearbeiten]
Ignorier-Callback für die grenzgeprüften Funktionen
(Funktion) [bearbeiten]