Was zur Hölle ist strsafe.h?
Jetzt mal ein kleines Intermezzo in der 64-bit Serie:
Heute wurde ich von einem Kollegen darauf hingewiesen, daß mein Code bei ihm nicht buildet, weil eine Datei strsafe.h nicht gefunden werden kann. Es stellte sich im weiteren Zweierlei heraus. Zum einen war bei dem Kollegen gerade das Netzlaufwerk weg, wo das W2K3 Server PlatSDK liegt, deshalb konnte über den include-Suchpfad die strsafe.h nicht gefunden werden, ich war also erstmal aus dem Schneider. Zum anderen aber offenbarte der Kollege, daß ihm der Zweck dieses Headerfiles nicht bekannt war. Wir beschlossen daher gemeinsam, daß ich darüber Bloggen sollte.
Die Datei strsafe.h ist ein Headerfile, das eine Riesenmenge an Funktionen für sicheres Stringhandling beinhaltet. Im Prinzip sind das alles inline-Funktionen, die sichere Wrapper rund um die Standard-C-runtime Funktionen wie sprintf und seine Freunde bietet. Darum ist strsafe sehr unkompliziert anzuwenden, weil man keine lib braucht und alles portabel in diesem einen Headerfile implementiert ist, das man lediglich nach den Headern der Runtime includieren muß. Das Ziel von strsafe.h ist es, die als unsicher verschrienen C-Runtime-Funktionen wie strcat, strcpy, gets, sprintf, strlen, vsprintf durch sicherere Varianten zu ersetzen, mit denen kein buffer overrun, sei es durch user input oder durch fehlerhafte Programmlogik entstanden, mehr möglich ist. Oder aus der msdn Doku zitiert:
"The advantages of the Strsafe functions include:
- The size of the destination buffer is always provided to the function to ensure that the function does not write past the end of the buffer.
- Buffers are guaranteed to be null-terminated, even if the operation truncates the intended result.
- All functions return an HRESULT, with only one possible success code (S_OK).
- Each function is available in a corresponding character count (cch) or byte count (cb) version.
- Most functions have an extended ("Ex") version available for advanced functionality."
Am Besten finde ich die ...Ex Funktionen, mit denen man beispielsweise in einer Schleife einen Buffer wie mit sprintf und einem Formatstring Stück für Stück befüllen kann und in jedem Schleifendurchlauf bekommt man mit [out]-Variablen das neue Stringende und die restliche Größe des Buffers zurück. Quasi sprintf on steroids!
Weil die Datei erst vor wenigen Jahren entstanden ist, ist sie natuerlich bei VC6 nicht mit in der Grundausstattung. Man muss ein halbwegs neues PlatSDK installiert haben und da ist die Datei dann dabei. Und natürlich gibt es alle Funktionen in ANSI, Unicode und character-set-agnostic Varianten.
Trackback address for this post
No feedback yet
Comments are closed for this post.