[英]Why does strcat_s crash if writing over the bound of a char array?
我知道,有关该主题的帖子已经很多,但是我没有发现任何令人满意的东西。 甚至谷歌也不是我的朋友。
所以,首先我的代码:
void secureCat() {
const int BUFFERSIZE = 5;
char buffer[BUFFERSIZE];
strcpy_s (buffer, BUFFERSIZE, "01");
cout << "1, buffer=" << buffer << endl;
errno_t rc = 0;
// still works
rc = strcat_s(buffer, BUFFERSIZE, "2");
cout << (rc == 0 ? "yippee" : "oh noooo") << endl;
cout << "2, buffer=" << buffer << endl;
// and now the crashing line
rc = strcat_s(buffer, BUFFERSIZE, "345");
cout << (rc == 0 ? "yippee" : "oh noooo") << endl;
cout << "3, buffer=" << buffer << endl;
}
我在装有MS VS 2010的Windows上使用了此代码,并遇到了以下问题:
strcat_s的第一个调用工作正常,这对我来说很清楚,因为新字符串的大小( "01"
+ "2"
+ NUL
字符)小于缓冲区大小。
但是,当超出缓冲区大小时,为什么第二个调用会崩溃? 据我了解MSDN,我应该得到一个错误代码,并且缓冲区应该只包含NUL字符。 该示例中的行为更类似于strcat的行为:我覆盖了自己的代码,因此崩溃了。
BTW:我知道,那还有其他的方法来连接字符串,它是一个更好的风格在它之前做检查。 因此,纯粹出于对幕后关注的兴趣。
谢谢罗伯特
[...]如果目标字符串太小,则会调用无效的参数处理程序,如Parameter Validation中所述 。
如果您遵循Parameter Validation链接 ,则可以阅读(强调我的意思):
无效的参数处理程序例程
[...] 默认无效参数调用Watson崩溃报告,这将导致应用程序崩溃,并询问用户是否要将崩溃转储加载到Microsoft进行分析。 在调试模式下,无效的参数还会导致断言失败。
可以通过使用函数
_set_invalid_parameter_handler
将无效的参数处理程序设置为您自己的函数来更改此行为。 [...]
或者,您可能需要考虑StringCchCat()
函数 ,如果目标缓冲区太小,该函数将返回等于STRSAFE_E_INSUFFICIENT_BUFFER
的HRESULT
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.