繁体   English   中英

如果覆盖char数组的边界,为什么strcat_s崩溃?

[英]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:我知道,那还有其他的方法来连接字符串,它是一个更好的风格在它之前做检查。 因此,纯粹出于对幕后关注的兴趣。

谢谢罗伯特

用于strcat_s()MSDN文档如下:

[...]如果目标字符串太小,则会调用无效的参数处理程序,如Parameter Validation中所述

如果您遵循Parameter Validation链接 ,则可以阅读(强调我的意思):

无效的参数处理程序例程

[...] 默认无效参数调用Watson崩溃报告,这将导致应用程序崩溃,并询问用户是否要将崩溃转储加载到Microsoft进行分析。 在调试模式下,无效的参数还会导致断言失败。

可以通过使用函数_set_invalid_parameter_handler将无效的参数处理程序设置为您自己的函数来更改此行为。 [...]


或者,您可能需要考虑StringCchCat()函数 ,如果目标缓冲区太小,该函数将返回等于STRSAFE_E_INSUFFICIENT_BUFFERHRESULT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM