_snprintfが正常に機能します。しかしなぜ_snprintf_sがブレークポイントを引き起こしたのですか?何か間違いがあるか、または何か非常に重要なものが欠けている。_snprintf_sが[applicaiton]を呼び出しました.exeがブレークポイントをトリガーしました
std::string hash_sha256_sa(const std::string source)
{
const int HASH_STRING = 64;
const int HASH_RAW = 32;
unsigned char _hash[HASH_RAW];
memset(_hash, 0, HASH_RAW);
sha256(_hash, (unsigned char*)&source[0], (unsigned long)source.length());
std::string str(HASH_STRING, 0);
for (int i = 0; i < HASH_RAW; ++i)
{
//_snprintf_s(&str[i * 2], HASH_STRING, _TRUNCATE, "%02X", _hash[i]); //Failed
//_snprintf(&str[i * 2], HASH_STRING,"%02X", _hash[i]); //Works
}
return str;
}
第2の変形例は、同じ結果を提供する。 _snprintfは正常に動作します。 _snprintf_sはエラーの後に結果を返します
変数 'バッファ'のランタイムチェック失敗2は、 が破損しました。
std::string hash_sha256_sa(const std::string source)
{
const int HASH_STRING = 64;
const int HASH_RAW = 32;
unsigned char _hash[HASH_RAW];
memset(_hash, 0, HASH_RAW);
sha256(_hash, (unsigned char*)&source[0], (unsigned long)source.length());
char buffer[HASH_STRING + 1];
for (int i = 0; i < HASH_RAW; ++i)
{
_snprintf_s(&buffer[i * 2], _countof(buffer), _TRUNCATE, "%02X", _hash[i]);
//_snprintf(&buffer[i * 2], _countof(buffer), "%02X", _hash[i]);
}
std::string str(buffer);
return str;
}
最初の実装と一緒に行く場合、あなたは正しいですが、どのような第2の実施について。 sizeof(buffer)が使用されていますが、バッファーの周りにスタックのエラーがあります。 snprintfは偶然には動作しません。私はsnprintfの亜種に何かが欠けていると思います。 – Rahul
もちろん、同じ問題です。あなたは '_countof(buffer)'を実行してもバッファ全体のサイズを引き継いでいますが、バッファ内のサブ文字列へのポインタだけを渡しています。 '_snprintf_s'関数には、与えられているバッファの実際の長さについて嘘をついています。はい、 '_snprintf'はまだ偶然によって完全に動作しています。 '_snprintf_s'がエラーをチェックしていないので、バグを捕まえることができません。 @rahul –
あなたが正しいのは、@BamakShmiraniが指すように、バッファの実際のサイズは、各ループの実行時にデクリメントする必要があります。重要なことがいくつか焦点を当てて残っていますか? – Rahul