gpt4 book ai didi

c++ - _snprintf_s 调用 [applicaiton].exe 已触发断点

转载 作者:行者123 更新时间:2023-11-30 02:28:22 26 4
gpt4 key购买 nike

_snprintf 工作正常。但是为什么_snprintf_s触发了断点。有没有什么错误/或者我遗漏了一些非常重要的东西。

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;
}

第二个变体提供相同的结果。 _snprintf 工作正常。但是 _snprintf_s 结果如下错误

Run-Time Check Failure #2 - Stack around the variable 'buffer' was corrupted.

 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;
}

最佳答案

_snprintf_s 是 Microsoft 提供的该函数的“安全”版本。如果它触发了一个断点,那么你在函数调用中做错了什么,这个错误是为了帮助你检测那个错误。 _snprintf 是不安全的并且是偶然工作的(因为它实际上依赖于未定义的行为)。

在这种情况下,您显然传递了错误的缓冲区长度(函数的第二个参数)。尽管 str 的总长度确实为 HASH_STRING,但您正在索引缓冲区 (str[i * 2]) 并返回一个指针到那个子缓冲区。显然,子缓冲区的长度不能与总缓冲区的长度相同!

关于c++ - _snprintf_s 调用 [applicaiton].exe 已触发断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40820073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com