5

以下のコードは興味深いことは何もしていませんが、謎は、メモリー博士がなぜユニット化された読み取りがあると考えるのでしょうか? 何か案は?

#include <memory>

int main(int argc, const char* argv[])
{
    int aa[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::unique_ptr<int[]> p {new int[10]};

    for (auto i = 0; i < 10; ++i) {
        p[i] = aa[i];
    }

    return 0;
} // <-- Dr Memory says UNINITIALIZED READ here

編集: これが完全なエラーの詳細です。

Error #1: UNINITIALIZED READ: reading 0x0028ff20-0x0028ff24 4 byte(s)
# 0 __mingw_glob                              [src/main.cpp:14]
# 1 _setargv                                  [src/main.cpp:14]
# 2 __mingw_CRTStartup
# 3 mainCRTStartup
# 4 ntdll.dll!RtlInitializeExceptionChain    +0x62     (0x772c8fe2 <ntdll.dll+0x38fe2>)
# 5 ntdll.dll!RtlInitializeExceptionChain    +0x35     (0x772c8fb5 <ntdll.dll+0x38fb5>)
Note: @0:00:00.297 in thread 9780
Note: instruction: cmp    (%esi) $0x0040a11e
4

1 に答える 1

2

関数で示されてmainいる行は、エラーが発生した行ではありません。__mingw_globスタック トレースで示されるようにエラーが発生しました。これは、コードが呼び出される前に発生しています。(これは、コマンド ラインで渡されたファイル名のワイルドカードを展開する関数です。Linux では、このジョブはシェルによって実行されますが、Windows では、C ランタイムが責任を負います。)

つまりmingw図書館で起きている。これは無害な誤検出である可能性が高いため、単純に除外を追加する必要があります。

おそらくDr Memoryは、コードが実行される前にオペレーティングシステムによって初期化されたか、DrMemoryが初期化される前に実行されたコードによって初期化されたため、またはシステムコールに渡されなかったため、これを初期化されていないと誤って識別したと思われます実際にはメモリを読み取りますが、書き込みのみを行います。

関数で間違った行が表示されるのはなぜですか?

デバッガーは、デフォルトで関連情報を表示しようとします。一般に、ライブラリ コードよりもコードにバグがある可能性が高いため、デバッガーはコール スタックにあるコードの最新のインスタンスを表示します。たとえば、呼び出しの実装固有の深さでエラーが発生した場合、障害freeのあるライブラリ ヒープ コードである可能性は低いため、呼び出したコードfreeが原因である可能性が高いと識別されます。

あなたの場合、コールスタックにコードがないため、アルゴリズムはコードを見つけることができず、誤った場所を示しています。

于 2015-10-09T12:04:09.583 に答える