14.9 Sicherere Funktionen mit C11
In Abschnitt 9.3.5, »Sicherere Funktionen zum Schutz vor Speicherüberschreitungen«, haben Sie ja bereits erfahren, dass es seit C11 als Erweiterung ein sogenanntes Bound-Checking-Interface gibt. Hierbei stehen Ihnen alternative Funktionen zu bereits vorhandenen »unsicheren« Funktionen der Standardbibliothek mit der Endung _s zur Verfügung (beispielsweise scanf_s() für scanf()). Werfen Sie ein Blick in Annex K des C11-Standards (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf ): Dort wird das Thema umfassender behandelt. Diese neuen Funktionen prüfen beispielsweise die Puffergröße und geben Fehlermeldungen aus, wenn der Puffer nicht groß genug ist. Auch Ergebnis-Strings werden immer mit den Stringende-Zeichen abgeschlossen, oder die Rückgabewerte sind einheitlich vom Typ errno_t und geben Informationen über den erfolgreichen oder nicht erfolgreichen Aufruf einer Operation zurück.
Da dieses Bound-Checking-Interface eine optionale C11-Erweiterung ist, müssen Sie prüfen, ob das Makro __STDC_LIB_EXT1__ gleich 1 ist, und ob die Erweiterung vorhanden ist und verwendet werden kann. Ist die Erweiterung vorhanden, müssen Sie nur die entsprechenden und bekannten Ein- und Ausgabefunktionen durch ihr jeweiliges Gegenstück mit der Endung _s ersetzen. Inzwischen gibt es Compiler, wie z. B. Microsofts Visual Studio, die Sie sogar dazu verpflichten, die Varianten mit der Endung _s zu benutzen. Sie können die Sicherheitsmeldungen hier aber auch mit dem folgenden define-Befehl aufheben:
#define _CRT_SECURE_NO_WARNINGS
Dies wird aber von Microsoft nicht mehr empfohlen.