Gibt es kostenlose Implementierungen von strcpy_s und/oder TR24731-1?

Lesezeit: 4 Minuten

Marks Benutzeravatar
Markieren

Ich habe ein altes Projekt, das C und C++ gemischt ist. Es macht ausgiebigen Gebrauch von C-Saiten und von strcpy,strcat,strncpy,strncat usw. Ich habe eine Reihe von Pufferüberläufen entdeckt und möchte sicherere Funktionen verwenden, z strcpy_s. MSVC enthält diese Funktionen, aber ich brauche etwas, das auf verschiedenen Plattformen funktioniert – zumindest Linux, OSX und Windows.

Ich weiß von strlcpyaber wie viele Leute bemerkt haben (Beispiel), es ist wirklich keine Verbesserung.


Also: Gibt es freie Implementierungen von strcpy_s, strcat_setc, oder des gesamten TR24731-1?

Ich brauche etwas, das beides ist public domain oder BSDaber wenn Sie Implementierungen unter anderen Lizenzen kennen, fahren Sie fort und listen Sie sie auf – ich bin sicher, jemand anderes wird davon profitieren.

  • Ist der MIT Lizenz ok? Es ist im Grunde BSD-3 ohne den dritten Satz, wenn ich mich nicht irre.

    – Joey Adams

    9. April 2012 um 0:45 Uhr

  • Ja, MIT ist in Ordnung. Ich habe vergessen, es zu erwähnen. Danke :)

    – Markieren

    9. April 2012 um 0:53 Uhr

  • Sie könnten an einer Verwendung interessiert sein mudflap auf Linux. Aus der Dokumentation: “So instrumentierte Module sollten immun gegen Pufferüberläufe, ungültige Heap-Nutzung und einige andere Klassen von C/C++-Programmierfehlern sein.” Es wird aktiviert durch -fmudflap auf GCC erfordert die Installation der mudflap Bibliothek, sollte aber wahrscheinlich für die C++-Teile vermieden werden.

    – Dietrich Ep

    9. April 2012 um 1:09 Uhr

  • Alternativ können Sie, um eine separate Bibliothek zu vermeiden, die (Standard ab C99) snprintf um die Aufgabe korrekt/sicher auszuführen (wenn möglich etwas langsamer aufgrund der Verarbeitung von Formatzeichenfolgen). Ein schlechter strncpy(dst, src, dstlen) direkt in ein Gut umwandeln kann snprintf(dst, dstlen, "%s", src);; Es gibt sogar die Anzahl der geschriebenen Zeichen zurück, sodass Sie auf Trunkierung testen können (wenn der Rückgabewert >= dstlendie Ausgabe wurde abgeschnitten).

    – ShadowRanger

    21. Juni 2018 um 16:09 Uhr

Benutzeravatar von Óscar López
Oscar López

Versuchen Sie es mit der Sicheres C Bibliothek. Es ist unter der MIT-Lizenz und danach aufführen implementiert die gesuchten Funktionen:

Die Safe C Library bietet Bound Checking Memory und String-Funktionen gemäß ISO/IEC TR24731. Diese Funktionen sind alternative Funktionen zur bestehenden Standard-C-Bibliothek, die eine sicherere Programmierung fördern

  • Guter Fund! Ich verbrachte ziemlich viel Zeit damit, The Google eine Antwort zu entlocken, hatte aber kein Glück.

    – Markieren

    9. April 2012 um 13:27 Uhr

Sie können verwenden memcpy und memset usw., die portabel und sicherer als Zeichenfolgenfunktionen sind.

  • Dies ist ein ausgezeichneter Vorschlag. Berufung strlen Einmal und dann Speicheroperationen mit expliziter Länge zu verwenden, ist eine sehr gute Möglichkeit, sicher mit Zeichenfolgen umzugehen.

    – Stefan Kanon

    9. April 2012 um 12:29 Uhr

  • Leistung kann das Problem sein Programmierungindarkroom.blogspot.it/2012/02/…

    – Massimo Fazzolari

    6. Juni 2013 um 21:03 Uhr

  • @MassimoFazzolari Das ist eine schlechte Art des Benchmarkings. In jedem dieser Memcpy-Aufrufe gibt es einen Aufruf von strlen(). Bei aktivierten Optimierungen gaben mir sowohl memcpy als auch strcpy die gleiche Zeit für diesen Code (da der Compiler wahrscheinlich Schleifen durchläuft, wenn er wiederholt dieselbe Zeichenfolge überschreibt). Ohne Optimierung und Austausch strlen(in) mit 12 zeigte memcpy doppelt so schnell wie strcpy.

    – PP

    7. Juni 2013 um 7:53 Uhr

Benutzeravatar von ouah
ouah

Warum nicht verwenden strncpy und strncat? Gegensätzlich zu strlcpy und strlcat, sie sind Standard-C-Funktionen. Diese Funktionen sind nicht perfekt, aber Sie können sie sicher verwenden.

Und beachten Sie auch, dass die Grenzen-Überprüfung _s Funktionen sind im aktuellen Standard optional.

  • strncpy und strncat einige Probleme haben, die es schwierig machen, sie sicher und effizient zu verwenden; Sie garantieren keine NUL-Terminierung des Zielpuffers, aber sie leisten auch mehr Arbeit, als für die Sicherheit beim Immerschreiben erforderlich ist n Zeichen, auch wenn die Zeichenfolge viel kürzer ist.

    – Stefan Kanon

    9. April 2012 um 1:01 Uhr

  • @StephenCanon, aber Sie können sie sicher verwenden.

    – au

    9. April 2012 um 1:02 Uhr

  • Strncpy und stncat sind niemals eine Lösung. Sie sind noch schlimmer als das Problem. Zusammen sind sie noch schlimmer. (strncpy kann zu einem nicht abgeschlossenen String führen, wenn nicht genügend Platz vorhanden ist, strncat kann am Ziel schreiben[len] )

    – Wildpässer

    9. April 2012 um 1:04 Uhr


  • @wildplasser ja, nicht vergessen - 1 zum strncpy und strncat und null beenden Sie die Zeichenfolge selbst für strncpy. Aber diese beiden Funktionen, auch wenn wir zugeben, dass sie schlecht gestaltet sind, tun, was sie von den Spezifikationen erwarten.

    – au

    9. April 2012 um 1:10 Uhr

  • Sich daran erinnern zu müssen, 1 zu addieren/subtrahieren, ist ein Rezept für eine Katastrophe. Am besten ist es meiner Meinung nach immer noch, nur die memxxx () -Funktionen zu verwenden und eine manuelle Zählung beizubehalten, oder snprintf () zu verwenden (das seit c99 stabil ist).

    – Wildpässer

    9. April 2012 um 1:13 Uhr

1432520cookie-checkGibt es kostenlose Implementierungen von strcpy_s und/oder TR24731-1?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy