2016-08-08 4 views
0

OpenSSLを使用してデジタル署名を追加するC++クラスを作成しています。std :: ofstreamは、unsigned charの配列が与えられたときに余分なバイトを出力します。リリースモードでのみです

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(); 

このコードは、デバッグモードでは正常に動作します。代わりにSHA_DIGEST_LENGTH = 20バイトのリリースモード、fout << hash印刷物30には、最後の10はゴミのように見える(多分バッファオーバーフロー?)

私の現在の回避策ではなく、ストリーミングの各文字を印刷することである。

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

どちらのビルドモードでも動作しますが、ストリーム演算子が文字列の長さを誤読させる原因となるのは不思議です。誰も思考を持っていますか?

私はMSVC++ 12(x86_amd64)でコンパイルしています。

+4

'SHA1'はバッファをヌル終了しますか? – aschepler

+0

また、 'temp.size()'にはヌルターミネータが含まれていないことに注意してください。 – NathanOliver

+0

これはCではないので、Cにタグを付けないでください。 –

答えて

3

選択されたNUL終了文字列用のストリーム挿入子があります。

しかし、任意のバイトを含む固定長の配列を出力しようとしていますが、これはまったく異なるものでUBにつながります。

代わりに代わりにmemberfunction write(buffer, size)を使用してください。