C++ _snprintf_s调用[applicationon].exe已触发断点

C++ _snprintf_s调用[applicationon].exe已触发断点,c++,mfc,C++,Mfc,_snprintf工作正常。但是为什么会触发断点呢。是否有任何错误/或我遗漏了一些非常重要的内容 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(_has

_snprintf工作正常。但是为什么会触发断点呢。是否有任何错误/或我遗漏了一些非常重要的内容

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;
}
std::string hash\u sha256\u sa(const std::string source)
{
常量int HASH_STRING=64;
常量int HASH_RAW=32;
无符号字符散列[hash_RAW];
memset(_hash,0,hash_RAW);
sha256(_hash,(unsigned char*)&source[0],(unsigned long)source.length());
std::string str(散列字符串,0);
for(int i=0;i
第二种变体提供了相同的结果_snprintf工作正常。但是,在出现错误后,会打印出结果

运行时检查失败#2-变量“buffer”周围的堆栈被删除 腐败

std::string hash\u sha256\u sa(const std::string source)
{
常量int HASH_STRING=64;
常量int HASH_RAW=32;
无符号字符散列[hash_RAW];
memset(_hash,0,hash_RAW);
sha256(_hash,(unsigned char*)&source[0],(unsigned long)source.length());
字符缓冲区[HASH_STRING+1];
for(int i=0;i
\u snprintf\u s
是微软提供的该功能的“安全”版本。如果它触发了一个断点,那么您在函数调用中做了一些错误,该错误旨在帮助您检测该错误<代码>\u snprintf
是不安全的,并且是意外工作的(因为它实际上依赖于未定义的行为)


在本例中,您显然传递了错误的缓冲区长度(函数的第二个参数)。虽然
str
的总长度确实为
HASH\u STRING
,但您正在索引到缓冲区(
str[i*2]
),并返回指向该子缓冲区的指针。显然,子缓冲区的长度不能与总缓冲区的长度相同

您并没有将
缓冲区
发送到
\u snprintf\u s
,而是发送
&buffer[i*2]
。每次增量时,
和缓冲区[i*2]
的可用大小将减少2。因此,更改为第二个参数,如下所示:

_snprintf_s(&buffer[i * 2], _countof(buffer) - i * 2, _TRUNCATE, "%02X", _hash[i]);

如果使用第一个实现,您是正确的,但是第二个实现呢。其中使用了sizeof(buffer),但错误是缓冲区周围的堆栈已损坏。snprintf不是偶然工作的。我想我在snprintf的变体中遗漏了一些东西。当然,同样的问题。在执行
\u countof(buffer)
操作时,仍在传递整个缓冲区大小,但只传递指向缓冲区内子字符串的指针。关于给定的缓冲区的实际长度,您正在向
\u snprintf\u s
函数撒谎。是的,
\u snprintf
仍然完全是意外地工作。它只是没有像
\u snprintf\u s
那样进行错误检查,因此无法捕获错误@rahulyou是对的,正如@BamakShmirani所指出的,每次循环执行时,缓冲区的实际大小必须减小。是否有重要的事情需要集中注意力,然后请指出
_snprintf_s(&buffer[i * 2], _countof(buffer) - i * 2, _TRUNCATE, "%02X", _hash[i]);