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

时间:2017-06-24 05:54:59

标签: c string stack-overflow

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.

我调试了测试用例并显示:

  

vstest.executionengine.x86.exe中0x627B1B69(spec.dll)的未处理异常:堆栈cookie检测代码检测到基于堆栈的缓冲区溢出。

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

任何人都可以解释一下。

1 个答案:

答案 0 :(得分:0)

在跳过空格时,内部循环可以点击'\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;
}