2016-08-08 36 views
0

Ich schreibe eine C++ - Klasse, um eine digitale Signatur zu einer PDF hinzuzufügen, mit OpenSSL, um einen SHA1-Hash zu generieren, den ich dann in eine Datei drucken:std :: Ofstream druckt zusätzliche Bytes, wenn ein Array unsigned char gegeben, aber nur im Freigabemodus

unsigned char hash[SHA_DIGEST_LENGTH]; 
SHA1((unsigned char *)temp.c_str(), temp.size(), hash); 

std::ofstream fout("resources/hash.out", std::ios::binary); 
fout << hash; 
fout.close(); 

Dieser Code funktioniert wie erwartet im Debug-Modus. Im Release-Modus, 30 fout << hash druckt statt SHA_DIGEST_LENGTH = 20 Bytes, die letzten 10 davon wie Müll aussieht (vielleicht Pufferüberlauf?)

Meine aktuelle Problemumgehung ist jedes Zeichen anstelle von Streaming drucken:

for (int i=0; i<SHA_DIGEST_LENGTH; ++i) 
    fout.put(hash[i]); 

Das funktioniert in beiden Build-Modi, aber ich bin gespannt, was könnte der Stream-Operator die Länge der Zeichenfolge falsch lesen. Hat jemand irgendwelche Gedanken?

Für den Datensatz kompiliere ich mit MSVC++ 12 (x86_amd64).

+4

Does 'SHA1' Null-kündigen den Puffer? – aschepler

+0

Beachten Sie auch, dass 'temp.size()' den Nullabschluss nicht enthält. – NathanOliver

+0

Dies ist nicht C, also markieren Sie es nicht C. –

Antwort

3

Es gibt einen Stream-Inserter für NUL-terminierte Strings, der ausgewählt ist.

Aber Sie versuchen, ein Array fester Länge mit beliebigen Bytes auszugeben, was etwas völlig anderes ist, was zu UB führt.

Verwenden Sie stattdessen die Memberfunktion write(buffer, size), die dafür ausgelegt ist.