3

次のコードで戻ったときに、このランタイムチェックの失敗を受け取ります。プログラムの他の場所でも同様のコードが正常に実行されていると思います。何か案は?

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("");
}
4

1 に答える 1

17

上記の例には変数 'x' はありませんが、エラー メッセージを編集したと仮定します。

acLine は初期化されていないため、最初に acPreviousLine にコピーするときは、たまたまスタックにあるものをすべてコピーしています。これにより、バッファー オーバーフローが発生し、状況によってはスタックが破損する可能性があります。これは、512 バイトに達する前に、幸運にも acLine で null を見つけることができるためです。

すべてのスタック変数の周りにガード ワードが挿入されているため (このプラットフォームとビルド構成では、デバッグ モードで VS でコンパイルされていると思われます)、その問題だけをチェックするためにスタックがチェックされます。

acLine[0] を 0 に初期化します。

于 2008-11-06T14:01:23.067 に答える