実行時チェックの失敗#2-変数「x」の周りのスタックが破損していました

StackOverflow https://stackoverflow.com/questions/268772

  •  06-07-2019
  •  | 
  •  

質問

次のコードで戻ると、このランタイムチェックエラーが発生します。同様のコードがプログラムの他の場所で正常に実行されていると思います。アイデアはありますか?

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に初期化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top