Wenn Leute sagen, " strcpy()
ist gefährlich, verwenden Sie strncpy()
stattdessen" (oder ähnliche Aussagen über strcat()
usw., aber ich werde strcpy()
hier als meinen Fokus verwenden), bedeuten sie, dass es keine Grenzen beim Einchecken gibt strcpy()
. Eine zu lange Zeichenfolge führt daher zu Pufferüberläufen. Sie sind richtig. Mit strncpy()
in diesem Fall wird Pufferüberläufe zu verhindern.
Ich denke, strncpy()
das behebt wirklich keine Fehler: Es löst ein Problem, das von einem guten Programmierer leicht vermieden werden kann.
Als C - Programmierer, Sie müssen die Zielgröße kennen , bevor Sie Zeichenfolgen zu kopieren versuchen. Dies ist auch die Annahme in strncpy()
und strlcpy()
's letzten Parametern: Sie geben ihnen diese Größe. Sie können auch die Quellgröße kennen, bevor Sie Zeichenfolgen kopieren. Wenn das Ziel nicht groß genug ist, rufen Sie nicht anstrcpy()
. Ordnen Sie den Puffer entweder neu zu oder tun Sie etwas anderes.
Warum mag ich nicht strncpy()
?
strncpy()
ist in den meisten Fällen eine schlechte Lösung: Ihre Zeichenfolge wird ohne vorherige Ankündigung abgeschnitten. Ich würde lieber zusätzlichen Code schreiben, um dies selbst herauszufinden, und dann die Vorgehensweise ausführen, die ich ausführen möchte, anstatt eine Funktion entscheiden zu lassen mir über was zu tun ist.
strncpy()
ist sehr ineffizient. Es schreibt in jedes Byte im Zielpuffer. Sie brauchen diese Tausenden '\0'
am Ende Ihres Ziels nicht.
- Es wird keine Beendigung geschrieben,
'\0'
wenn das Ziel nicht groß genug ist. Sie müssen dies also trotzdem selbst tun. Die Komplexität ist die Mühe nicht wert.
Nun kommen wir zu strlcpy()
. Die Änderungen von strncpy()
machen es besser, aber ich bin nicht sicher, ob das spezifische Verhalten von strl*
ihre Existenz rechtfertigt: Sie sind viel zu spezifisch. Sie müssen noch die Zielgröße kennen. Es ist effizienter als strncpy()
weil es nicht unbedingt in jedes Byte im Ziel schreibt. Aber es löst ein Problem, das gelöst werden kann, indem man : *((char *)mempcpy(dst, src, n)) = 0;
.
Ich glaube nicht, dass jemand das sagt strlcpy()
oder strlcat()
zu Sicherheitsproblemen führen kann, was er (und ich) sagen, dass sie zu Fehlern führen können, zum Beispiel wenn Sie erwarten, dass die vollständige Zeichenfolge anstelle eines Teils davon geschrieben wird.
Das Hauptproblem hierbei ist: Wie viele Bytes müssen kopiert werden? Der Programmierer muss dies wissen und wenn er es nicht tut strncpy()
oder strlcpy()
nicht retten wird.
strlcpy()
und strlcat()
sind nicht Standard, weder ISO C noch POSIX. Ihre Verwendung in tragbaren Programmen ist daher unmöglich. Tatsächlich strlcat()
gibt es zwei verschiedene Varianten: Die Solaris-Implementierung unterscheidet sich von den anderen für Randfälle mit der Länge 0. Dies macht sie noch weniger nützlich als sonst.
strlcpy
undstrlcat
würde eine Art Fehlerbedingung melden, wenn sie gegen die Größenbeschränkung des Zielpuffers stoßen würden. Obwohl Sie die zurückgegebene Länge überprüfen können, um dies zu testen, ist dies nicht offensichtlich. Aber ich denke, das ist eine kleine Kritik. Das Argument "Sie fördern die Verwendung von C-Strings und sind daher schlecht" ist albern.