本文介绍了运行时检查失败#2 - 变量'x'周围的堆栈已损坏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在下面的代码中返回时收到此运行时检查失败。我相信类似的代码在程序中的其他地方运行良好。任何想法?

I receive this Run-Time Check Failure upon the return in the following code. I believe similar code is running fine elsewhere in the program. Any ideas?

String GetVariableName(CString symbol, CString filepath)
{
    char acLine[512];
    char acPreviousLine[512];
    CString csFile;
    FILE *fp;

    csFile.Format("%svariables.txt", filepath);

    fp = fopen(csFile, "r");

    if (! fp)
    	return("");

    for (;;)
    {
    	strcpy(acPreviousLine, acLine);

    	// NULL means we are out of lines in the file.
    	if (myfgets(acLine, 511, fp) == NULL)
    		break;

        // "END" indicates end of file
    	if (! strcmp(acLine, "END"))
    		break;

    	if (! strcmp(acLine, csVarSymbol))
    	{
    		// Previous line should be variable name
    		fclose(fp);

            // Following line results in Check Failure while in Debug mode
    		return(acPreviousLine);
    	}
    }
    fclose(fp);
    return("");
}


推荐答案

'在上面的例子中,但我会假设你编辑错误消息!

There is no variable 'x' in the above example, but I'll presume you edited the error message!

acLine没有初始化,所以你第一次将它复制到acPreviousLine,复制堆栈上发生的任何事情。这可以给你一个缓冲区溢出,因此堆栈损坏在某些情况下 - 不是所有,因为你可能会幸运,并找到一个null在acLine之前,你得到512字节。

acLine isn't initialised, so the first time you copy it to acPreviousLine, you are copying whatever happens to be on the stack. This can give you a buffer overflow and therefore stack corruption in some situations - not all, because you might be lucky and find a null in acLine before you get to 512 bytes.

返回时检查堆栈是否损坏,因为有保护字(在此平台和构建配置 - 我假设是在Windows上,在调试模式)

The stack gets checked for corruption on return, because there are guard words (on this platform and build configuration - which I presume is on Windows, compiling on VS in debug mode) inserted around all stack variables to check for just that problem.

将acLine [0]初始化为0。

Initialise acLine[0] to 0.

这篇关于运行时检查失败#2 - 变量'x'周围的堆栈已损坏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 08:45