gpt4 book ai didi

c - 使用字符串的基于堆栈的缓冲区溢出异常

转载 作者:行者123 更新时间:2023-11-30 19:33:53 25 4
gpt4 key购买 nike

char removeSpaces(char* str)
{
if (str == NULL)
return '\0';

int i = 0, j = 0;

while (str[i] != '\0')
{
while (str[i] == ' ')
i++;
str[j++] = str[i++];
}
str[j] = '\0';
return str[0];
}

我在编译器中执行代码没有任何问题。当我尝试在 Visual Studio 中运行它时,我遇到了问题。

测试用例通过并带有绿色勾号,但之后中止,并且显示的消息是:

The active Test Run was aborted because the execution process exited unexpectedly. To investigate further, enable local crash dumps either at the machine level or for process vstest.executionengine.x86.exe.

我调试了测试用例,它显示:

Unhandled exception at 0x627B1B69 (spec.dll) in vstest.executionengine.x86.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

如果有此异常的处理程序,则程序可以安全地继续。

任何人都可以解释一下吗?

最佳答案

在跳过空格时,内层循环可以命中'\0',而在i++之后(在赋值中),外层循环将看不到它。更多,并将在'\0'之后继续扫描。如果字符串包含尾随空格,就会发生这种情况。

<小时/>

您可以通过使用 for() 循环将循环逻辑集中在一行上来避免这种簿记错误:

<小时/>
void squeezespace(char*string)
{
size_t i,j;

for(i=j=0; string[i]; i++) { // loop logic on one line
if( string[i] == ' ') continue;
string[j++] = string[i] ;
}
string[j] = 0;
}

关于c - 使用字符串的基于堆栈的缓冲区溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44733285/

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