0

OS: Windows x86、MFC、CRT、VS2010

Visual Studio 2005 (SP1) から VS2010-SP1 にアップグレードした後、ランタイム CRT ヒープ破損例外が発生しました。

私のアプリがデバッグでコンパイルされている場合、CRT は破損についてのみ文句を言います。また、VS2010 はメモリ アクセスを評価する際に厳密すぎると思います。

疑わしい問題のコードは、次のことを行います。

typedef struct _T_TEST
{
    DWORD flag;
    TCHAR str[1];
} T_TEST;

// Then the structure is used in this way
void test(TCHAR * p_str) {
    DWORD size = sizeof(DWORD) + (_tcslen(p_str) + 1) * sizeof(TCHAR);
    T_TEST * foo = (T_TEST *) calloc(size, 1);
    foo->flag = 0;
    _tcscpy_s(foo->str, size - sizeof(DWORD), p_str);
    // Do IPC with the struct
    // When finished, free it
    free(foo);
}

このコードfree(foo)は、割り当てられたバッファを にキャストするときに失敗することがあります(T_TEST *)

そのように構造体のサイズを拡張することは有効ですか? そして、それをヒープの破損として扱うVS2010に何か違いはありますか?

どんな助けでも大歓迎です!

4

2 に答える 2

2

の 2 番目のパラメーター_tcscpy_sは要素の数ですが、バイト数を入力しています。ドキュメントによると:

これらの関数のデバッグ バージョンは、最初にバッファを 0xFE で埋めます。

sizeof(TCHAR) != 1 の場合、バッファ オーバーフローが発生します。

于 2013-08-21T21:14:50.770 に答える