Ich arbeite derzeit an einer Bibliothek, die in C geschrieben ist. Viele Funktionen dieser Bibliothek erwarten einen String als char*
oder const char*
in ihren Argumenten. Ich habe mit diesen Funktionen begonnen und immer die Länge des Strings als erwartet, size_t
so dass keine Null-Terminierung erforderlich war. Beim Schreiben von Tests wurde jedoch häufig Folgendes verwendet strlen()
:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
Das Vertrauen des Benutzers, ordnungsgemäß terminierte Zeichenfolgen zu übergeben, würde zu weniger sicherem, aber präziserem und (meiner Meinung nach) lesbarem Code führen:
libFunction("I hope there's a null-terminator there!");
Also, was ist die vernünftige Praxis hier? Machen Sie die Verwendung der API komplizierter, aber zwingen Sie den Benutzer, über ihre Eingaben nachzudenken, oder dokumentieren Sie die Anforderung einer nullterminierten Zeichenfolge und vertrauen Sie dem Aufrufer?
CreateFile
einenLPTCSTR lpFileName
Parameter als Eingabe. Vom Aufrufer wird keine Länge der Zeichenfolge erwartet. Tatsächlich ist die Verwendung von mit NUL abgeschlossenen Zeichenfolgen so tief verwurzelt, dass in der Dokumentation nicht einmal erwähnt wird, dass der Dateiname mit NUL abgeschlossen sein muss (aber natürlich muss dies der Fall sein).