19 Stimmen

Memcpy() in der sicheren Programmierung?

Kürzlich bin ich über Folgendes gestolpert ein Artikel die behauptet, Microsoft verbiete die memcpy() Funktion in seinen sicheren Programmiershops. Ich verstehe die Schwachstellen dieser Funktion, aber ist es notwendig, ihre Verwendung ganz zu verbieten?

Sollten Programme, die ich schreibe, vermieden werden memcpy() oder nur dafür sorgen, dass es sicher verwendet wird? Welche Alternativen gibt es, die ähnliche, aber sicherere Funktionen bieten?

2voto

Anton Kazennikov Punkte 3516

Ich denke, dass C dem Programmierer die Möglichkeit lassen sollte, sich selbst in den Fuß zu schießen. Manuelle Speicherverwaltung ist sicher, wenn sie richtig gemacht wird.

2voto

Sie haben es selbst gesagt: "Microsoft verbietet die Funktion memcpy() in seinem sichere Programmierungsgeschäfte Ich verstehe die Schwachstellen, die mit der Funktion verbunden sind ,"

memcpy() und eine Vielzahl anderer Standardfunktionen sind dafür bekannt, Schwachstellen zu verursachen. Warum also sollte eine sichere Programmierwerkstatt ihre Verwendung zulassen, wenn eine (wenn auch schrittweise) Verbesserung trivial ist?

Zweifellos in dem Bestreben, die Sicherheit ihrer eigenen Produkte zu verbessern, haben die Codeüberprüfungen deutlich gezeigt, dass diese Funktionen für einen erheblichen Teil der Sicherheitslücken, Pufferüberläufe usw. verantwortlich sind. Anstatt Wrapper nur für den internen Gebrauch zu erstellen, wurden sie in die Standardbibliothek aufgenommen und zum Nutzen aller mit einer Compilerwarnung (nicht mit einem Verbot) versehen.

0voto

Sean Punkte 58522

Die Alternative ist der Aufruf von memcpy_s

0voto

mseebeck Punkte 1

Wenn Sie ältere Versionen verwenden, wie C99 oder C++98, oder auf Solaris, können Sie memcpy_s nicht verwenden, es sei denn, Sie haben die Safe C-Bibliothek installiert.

memcpy_s() ist eine Microsoft-spezifische Implementierung, die es in Nicht-MS-Implementierungen, einschließlich ANSI, vor C11 gemäß deren eigenen Standards nicht gibt.

Ich lasse das Pro-MS- und Anti-MS-Zeug beiseite, denn es ist irrelevant.

memmove() ist in jedem Fall die bessere Lösung, da es das Problem der Überlappung löst. memmove_s() ist robuster, aber auch hier gilt, dass es nur in C11 oder später funktioniert.

-2voto

Jem Punkte 2175

Sie sollten stattdessen memcpy_s() verwenden. Die gleiche Art von _s-Versionen gibt es für eine Vielzahl anderer Funktionen, die als unsicher gelten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X