実行時チェックの失敗#2-変数「x」の周りのスタックが破損していました
質問
次のコードで戻ると、このランタイムチェックエラーが発生します。同様のコードがプログラムの他の場所で正常に実行されていると思います。アイデアはありますか?
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("");
}
解決
上記の例には変数「x」はありませんが、エラーメッセージを編集したと仮定します!
acLineは初期化されていないため、acPreviousLineに初めてコピーするときには、スタック上にあるものをすべてコピーしています。これにより、バッファオーバーフローが発生し、状況によってはスタックが破損する可能性があります。すべてではありません。512バイトに達する前にacLineでnullが見つかる可能性があるためです。
すべてのスタック変数の周りに挿入されたガードワード(このプラットフォームとビルド構成-デバッグモードでVSでコンパイルしていると仮定します)がすべてのスタック変数の周りに挿入されているため、戻り時にスタックがチェックされます。 。
acLine [0]を0に初期化します。
所属していません StackOverflow