我在以下代码中返回时收到此运行时检查失败.我相信类似的代码在程序的其他地方运行良好.有任何想法吗?
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(""); }
Airsource Lt.. 17
在上面的例子中没有变量'x',但我猜你编辑了错误信息!
acLine未初始化,因此第一次将其复制到acPreviousLine时,您正在复制堆栈中发生的任何事情.这可能会给你一个缓冲区溢出,因此在某些情况下堆栈损坏 - 不是全部,因为你可能很幸运,在你到达512字节之前在acLine中找到一个null.
在返回时检查堆栈是否有损坏,因为在所有堆栈变量周围插入保护字(在此平台和构建配置上 - 我假设在Windows上,在VS上以调试模式编译)以检查该问题.
将acLine [0]初始化为0.
在上面的例子中没有变量'x',但我猜你编辑了错误信息!
acLine未初始化,因此第一次将其复制到acPreviousLine时,您正在复制堆栈中发生的任何事情.这可能会给你一个缓冲区溢出,因此在某些情况下堆栈损坏 - 不是全部,因为你可能很幸运,在你到达512字节之前在acLine中找到一个null.
在返回时检查堆栈是否有损坏,因为在所有堆栈变量周围插入保护字(在此平台和构建配置上 - 我假设在Windows上,在VS上以调试模式编译)以检查该问题.
将acLine [0]初始化为0.