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に何か違いはありますか?
どんな助けでも大歓迎です!