c0000005(ACCESS_VIOLATION)从VS 2010迁移到VS 2017后 [英] c0000005 (ACCESS_VIOLATION) After migrate from VS 2010 into VS 2017

查看:198
本文介绍了c0000005(ACCESS_VIOLATION)从VS 2010迁移到VS 2017后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个程序在Windows 2012和Windows 2016上不断抛出异常。 代码从VS 2010迁移到VS 2017 - VS成功迁移项目时代码无变化。代码被编译为64位,就像它在2010年的VS
中一样。


当运行EXE时,它会立即抛出异常。  我需要修复或添加参数来重新编译吗?




调试器告诉我现在代码在ULongToPtr上失败了()


             thread_context-> m_arg_list [count] =(UINT)PtrToUlong((void *)new char [str_len + 1]);


 失败 - >  strcpy((char *)UlongToPtr(thread_context-> m_arg_list [count ++]),string_array [index]);


  "eTskEil.exe中0x00007FFEBFB213ED(ucrtbase.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x0000000040043D10。"



运行于DOS提示


 <! -                 &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; - >

 <! - 例外参数 - >

 <! -       &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; - >
$
 < time>     02/26/2019 11:20:24              < / time>

 < parent>   XXXXX.exe&NBSP; < / parent>

 < threadId> XXXX6&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP; < / threadId>

 < Build> 1355&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP; < / Build>

 < HandleCount> 90&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP; < / HandleCount>

 < GdiObjects> 4&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; < / GdiObjects>

 < UserObjects> 1&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; < / UserObjects>

 < code>     c0000005(ACCESS_VIOLATION)  < / code>

 < address>  00007FFB97257D12 01:00016D12             < / address>

 < flags>    00000000&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; < / flags>

 < param0>   0000000000000001&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; < / param0>

 < param1>   000000003DA3A500(访问地址)      < / param1>


  <! - &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; - >

  <! - 加载的模块(开始,结束,时间,校验和,名称) - >

  <! - &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; - >

  <模块>&NBSP; 00007FF646BD0000,00007FF646D52000,Thu Feb 21 09:43:47 2019,00000
$
00,XXXXX.exe  < / module>

  <模块>&NBSP; 00007FFA23740000,00007FFA238ED000,Thu Sep 14 09:40:43 2017,001ad

bf,C:\ Windows \ SYSTEM32 \\\\\\\\\\\\\\\\\\\ < / module>

  <模块>&NBSP; 00007FFA23580000,00007FFA236BE000,Tue Oct 28 22:45:30 2014,00140
$
ec,C:\ Windows \system32 \ KERNEL32.DLL< / module>

  <模块>&NBSP; 00007FFA20C60000,00007FFA20D75000,Sun Apr 16 05:21:24 2017,00117
$
62,C:\ Windows\system32 \ KERNELBASE.dll< / module>

  <模块>&NBSP; 00007FFA01950000,00007FFA01EDC000,11月周三  7月13日13:48:59,0058a

3d,C:\ Windows \ SYSTEM32 \mfc140.dll   < / module>

  <模块>&NBSP; 00007FFA20DD0000,00007FFA20F47000,11月Wedn  9 12:49:59 2016,00187

a8,C:\ Windows \ system32 \ USER32.dll   < / module>

  <模块>&NBSP; 00007FFA23370000,00007FFA2341A000,Sep Sep  6 10:14:56 2017,000b2
$
56,C:\ Windows\system32 \ ADVAPI32.dll< / module>

  <模块>&NBSP; 00007FFA22FB0000,00007FFA23144000,Sun Apr 16 02:54:07 2017,0019f

af,C:\ Windows\system32 \ole32.dll    < / module>

  <模块>&NBSP; 00007FFA213F0000,00007FFA214B6000,Sun Apr 16 03:33:35 2017,00cdcd

d5,C:\ Windows\system32 \OLEAUT32.dll< / module>

  <模块>&NBSP; 00007FFA22F90000,00007FFA22FA6000,Tue Oct 28 21:21:18 2014,0001d

bb,C:\ Windows\system32\imagehlp.dll< / module>

  <模块>&NBSP; 00007FFA20F50000,00007FFA20FAA000,2016年5月13日星期五17:58:43,0005c

24,C:\ Windows \ system32 \ WS2_32.dll   < / module>

  <模块>&NBSP; 00007FFA15100000,00007FFA15115000,11月Wedn  7月13日13:35:37,00017
$
21,C:\ Windows \ SYSTEM32 \ VCRUNTIME140.dll< / module>

  <模块>&NBSP; 00007FFA091A0000,00007FFA091A4000,Tue Jul 14 21:27:26 2015,0000f

a2,C:\ Windows \ SYSTEM32 \ api-ms-win-crt-string-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA09190000,00007FFA09194000,Tue Jul 14 21:27:25 2015,00013
$
e8,C:\ Windows \SYSTEM32 \ api-ms-win-crt-stdio-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA09180000,00007FFA09183000,Tue Jul 14 21:27:26 2015,0000b

da,C:\ Windows \ SYSTEM32 \ api-ms-win-crt-heap-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA08F60000,00007FFA08F64000,Tue Jul 14 21:27:26 2015,0000b

fc,C:\ Windows \SYSTEM32 \ api-ms-win-crt-convert-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA08F50000,00007FFA08F53000,Tue Jul 14 21:27:26 2015,001010

9b,C:\ Windows \SYSTEM32 \ api-ms-win-crt-time-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA08F40000,00007FFA08F44000,Tue Jul 14 21:27:26 2015,0000a

4d,C:\ Windows \SYSTEM32 \ api-ms-win-crt-runtime-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA08F30000,00007FFA08F33000,Tue Jul 14 21:27:25 2015,0000a

86,C:\ Windows \SYSTEM32 \ api-ms-win-crt-filesystem-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA07B10000,00007FFA07B15000,Tue Jul 14 21:27:25 2015,00013
$
16,C:\ Windows \SYSTEM32 \ api-ms-win-crt-multibyte-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA07B00000,00007FFA07B03000,Tue Jul 14 21:27:26 2015,0000d

73,C:\ Windows \SYSTEM32 \ api-ms-win-crt-utility-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA02720000,00007FFA02725000,Tue Jul 14 21:27:26 2015,00014
$
29,C:\ Windows \SYSTEM32 \ api-ms-win-crt-math-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA02550000,00007FFA02553000,Tue Jul 14 21:27:25 2015,0000b

dc,C:\ Windows \SYSTEM32 \ api-ms-win-crt-locale-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA01940000,00007FFA01943000,Tue Jul 14 21:27:26 2015,00005

c1,C:\ Windows \ SYSTEM32 \ api-ms-win-crt-environment-l1-1-0 .dll< / module>

  <模块>&NBSP; 00007FFA21670000,00007FFA217BB000,Fri Sep  8 13:13:16 2017,00150

9b,C:\ Windows \ system32 \ GDI32.dll    < / module>

  <模块>&NBSP; 00007FFA21310000,00007FFA21364000,Tue Oct 28 20:52:51 2014, 0005b

27,C:\ Windows \ system32 \ SHLWAPI.dll  < / module>

  <模块>&NBSP; 00007FFA22E30000,00007FFA22E66000,Tue Oct 28 21:23:43 2014,0003a

b5,C:\ Windows\system32 \IMM32.dll    < / module>

  <模块>&NBSP; 00007FFA1F530000,00007FFA1F659000,Tue Oct 10 12:39:30 2017,00128

f2,C:\ Windows \ SYSTEM32 \ UxTheme.dll  < / module>

  <模块>&NBSP; 00007FFA21260000,00007FFA2130A000,Tue Oct 28 2014年2月22日50:50,000b0¥b $ b b4,C:\ Windows \ system32 \msvcrt.dll   < / module>

  <模块>&NBSP; 00007FFA21380000,00007FFA213D9000,Fri Mar 20 00:08:34 2015,00062
$
fd,C:\ Windows \SYSTEM32 \sechost.dll  < / module>

  <模块>&NBSP; 00007FFA22CF0000,00007FFA22E30000,2016年3月31日星期三00:13:42,0014f

8a,C:\ Windows \ system32 \RPCRT4.dll   < / module>

  <模块>&NBSP; 00007FFA23150000,00007FFA23362000,Sun Apr 16 03:41:51 2017,0021b

31,C:\ Windows \ SYSTEM32 \ combase.dll  < / module>

  <模块>&NBSP; 00007FFA21370000,00007FFA21379000,Tue Oct 28 22:48:43 2014,00007

6b,C:\ Windows \ system32 \ NSI.dll      < / module>

  <模块>&NBSP; 00007FFA23420000,00007FFA23571000,Sep Sep  9 12:16:52 2017,00152

3d,C:\ Windows \ system32 \ MSCTF.dll    < / module>

  <模块>&NBSP; 00007FFA20BD0000,00007FFA20BFE000,Tue Oct 28 2014年1月21日21:29:54,0002c
$
2a,C:\ Windows \ system32 \SspiCli.dll  < / module>

  <模块>&NBSP; 00007FFA01840000,00007FFA01934000,星期二九月  5 03:19:44 2017,000ff,
89,C:\ Windows \SYSTEM32 \ ucrtbase.DLL< / module>

  <模块>&NBSP; 00007FFA01790000,00007FFA01834000,Fri Apr 24 22:34:22 2015,000a1

4e,C:\ Windows \ WinSxS \ amd64_microsoft.windows.common-controls_6595b64144ccf1df_

.82.9600.17810_none_34ae2abd958aedeb\Comctl32.dll< / module>

  <模块>&NBSP; 00007FFA1F690000,00007FFA1F69B000,Tue Oct 28 21:27:02 2014,00014
$
cc,C:\ Windows \SYSTEM32 \ kernel.appcore.dll< / module>

  <模块>&NBSP; 00007FFA015F0000,00007FFA01779000,Tue Mar 31 23:45:14 2015,00178

26,C:\ Windows \ system32 \ dbghelp.dll  < / module>

  <! - &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; - >

  <! - 调用堆栈信息  - >

  <! - &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; - >

  < frame>

     < PC> 00007FFA01857D12,strcpy + 22(C:\ Windows \ SYSTEM32 \ ucrtbase.DLL)< / pc>

     <信源>源文件未知。原因0x1e7< / source>

  < / frame>

  < frame>

     < PC> 00007FF646C986A7(XXXXX.exe)[000001e7]< / pc>

  < / frame>

  < frame>

     < PC> 00007FF646C9F32C(XXXXX.exe)[000001e7]< / pc>

  < / frame>

  < frame>

     < PC> 00007FF646C87005(XXXXX.exe)[000001e7]< / pc>

  < / frame>

  < frame>

     < PC> 00007FF646C8305E(XXXXX.exe)[000001e7]< / pc>

  < / frame>

  < frame>

     < PC> 00007FF646CBFF18(XXXXX.exe)[000001e7]< / pc>

  < / frame>

  < frame>

     < PC> 00007FFA235813D2,BaseThreadInitThunk + 22(C:\ Windows \system32 \ KERNEL3)
.DLL)< / pc>

     <信源>源文件未知。原因0x1e7< / source>

  < / frame>

  < frame>

     < PC> 00007FFA237554F4,RtlUserThreadStart + 34(C:\ Windows \SYSTEM32 \\\
tdll.dl

)< / pc>

     <信源>源文件未知。原因0x1e7< / source>

  < / frame>

/例外>

$


$






b



$ b





$






$


$


$









$ b



解决方案

我真的很惊讶,这首先起作用了。


您正在向UINT转换64位指针,这是一个32位变量。基本上你正在切断变量的一半,并以某种方式期望它起作用。


这是一个主要的类型错误,如果它不是用于强制转换那么它就不会编译。 / p>

如果您仍然想知道为什么会出现这样的问题。采取一个非常小的示例程序:

 #include< new> 
#include< Windows.h>

int wmain()
{
char * c = new char;
char * d;

d = reinterpret_cast< char *>(PtrToUlong(c));

返回0;
}

这在哪里分配内存?


好吧,在这个代码的一个示例运行中,new返回了指针:


0x00000146,b0740850


我用逗号将其分成4个字节。现在,如果我们继续,然后实际查看d设置为什么,它是:


0x00000000,b0740850


你注意到它是怎么回事已经完全改变了指针的值,所以它指向一个完全不同的内存块?是的,通过使用PtrToUlong,你破坏了破坏它的指针的高4字节。


你永远无法将指针强制转换为更小的尺寸,而PtrToUlong隐藏编译器警告你当你收缩它时应该得到。如果用石膏替换PtrToUlong:

 d = reinterpret_cast< char *>(reinterpret_cast< unsigned long>(c)); 

这是PtrToUlong函数本质上的功能,你可以在Windows标题中看到它:

 __ inline 
unsigned long
PtrToUlong(
const void * p

{
return((unsigned long)(ULONG_PTR)p);
}

你应该收到警告:


1> c:\ usersrs \archa\source\repos\meh\source\main.cpp(9):警告C4311:'reinterpret_cast':指针截断从'char *'到'unsigned long'

1> c:\ usersrs \archa \ source \ repos \meh \ source \ main.cpp(9):警告C4302:'reinterpret_cast':从'char *'截断到'unsigned long'

1> c:\ usersrs \archa \ source \ times \ mehh \ source \ main.cpp(9):警告C4312:'reinterpret_cast':从'unsigned转换长'到'更大'的char *'


除非您完全禁用警告,否则这些应该是这些警告,因为它们是1级和2级警告。


所以TL; DR PtrToUlong将无条件地破坏64位指针。你必须永远不要使用它,除非你想要编写因运气而只能工作的破碎应用程序。


I have a program keeps throwing out exceptions on Windows 2012 and Windows 2016.  The codes were migrated from VS 2010 to VS 2017 - No change in codes as VS successfully migrate the project. The codes were compiled to 64-bits as it used to be in VS 2010.

When run the EXE it throws out exceptions immediately.  Is anything I need to fix or add parameters to recompile ?

The debugger told me the code now fails on ULongToPtr()

             thread_context->m_arg_list[ count ] = (UINT) PtrToUlong((void*)new char[ str_len + 1 ]);

 Failed ->  strcpy((char *)UlongToPtr(thread_context->m_arg_list[count++]), string_array[index]);

  "Unhandled exception at 0x00007FFEBFB213ED (ucrtbase.dll) in eTskEil.exe: 0xC0000005: Access violation writing location 0x0000000040043D10."

Run in DOS prompt

 <!--                      -->
 <!-- Exception parameters -->
 <!--                      -->
 <time>     02/26/2019 11:20:24              </time>
 <parent>   XXXXX.exe  </parent>
 <threadId> XXXX6                             </threadId>
 <Build> 1355                             </Build>
 <HandleCount> 90                               </HandleCount>
 <GdiObjects> 4                                </GdiObjects>
 <UserObjects> 1                                </UserObjects>
 <code>     c0000005 (ACCESS_VIOLATION)  </code>
 <address>  00007FFB97257D12 01:00016D12             </address>
 <flags>    00000000                         </flags>
 <param0>   0000000000000001                         </param0>
 <param1>   000000003DA3A500 (Address accessed)      </param1>

  <!--                                 -->
  <!-- Loaded modules (start,end,time,checksum, name) -->
  <!--                                 -->
  <module>  00007FF646BD0000, 00007FF646D52000, Thu Feb 21 09:43:47 2019, 00000
00, XXXXX.exe  </module>
  <module>  00007FFA23740000, 00007FFA238ED000, Thu Sep 14 09:40:43 2017, 001ad
bf, C:\Windows\SYSTEM32\ntdll.dll    </module>
  <module>  00007FFA23580000, 00007FFA236BE000, Tue Oct 28 22:45:30 2014, 00140
ec, C:\Windows\system32\KERNEL32.DLL </module>
  <module>  00007FFA20C60000, 00007FFA20D75000, Sun Apr 16 05:21:24 2017, 00117
62, C:\Windows\system32\KERNELBASE.dll </module>
  <module>  00007FFA01950000, 00007FFA01EDC000, Wed Nov  7 13:48:59 2018, 0058a
3d, C:\Windows\SYSTEM32\mfc140.dll   </module>
  <module>  00007FFA20DD0000, 00007FFA20F47000, Wed Nov  9 12:49:59 2016, 00187
a8, C:\Windows\system32\USER32.dll   </module>
  <module>  00007FFA23370000, 00007FFA2341A000, Wed Sep  6 10:14:56 2017, 000b2
56, C:\Windows\system32\ADVAPI32.dll </module>
  <module>  00007FFA22FB0000, 00007FFA23144000, Sun Apr 16 02:54:07 2017, 0019f
af, C:\Windows\system32\ole32.dll    </module>
  <module>  00007FFA213F0000, 00007FFA214B6000, Sun Apr 16 03:33:35 2017, 000cd
d5, C:\Windows\system32\OLEAUT32.dll </module>
  <module>  00007FFA22F90000, 00007FFA22FA6000, Tue Oct 28 21:21:18 2014, 0001d
bb, C:\Windows\system32\imagehlp.dll </module>
  <module>  00007FFA20F50000, 00007FFA20FAA000, Fri May 13 17:58:43 2016, 0005c
24, C:\Windows\system32\WS2_32.dll   </module>
  <module>  00007FFA15100000, 00007FFA15115000, Wed Nov  7 13:35:37 2018, 00017
21, C:\Windows\SYSTEM32\VCRUNTIME140.dll </module>
  <module>  00007FFA091A0000, 00007FFA091A4000, Tue Jul 14 21:27:26 2015, 0000f
a2, C:\Windows\SYSTEM32\api-ms-win-crt-string-l1-1-0.dll </module>
  <module>  00007FFA09190000, 00007FFA09194000, Tue Jul 14 21:27:25 2015, 00013
e8, C:\Windows\SYSTEM32\api-ms-win-crt-stdio-l1-1-0.dll </module>
  <module>  00007FFA09180000, 00007FFA09183000, Tue Jul 14 21:27:26 2015, 0000b
da, C:\Windows\SYSTEM32\api-ms-win-crt-heap-l1-1-0.dll </module>
  <module>  00007FFA08F60000, 00007FFA08F64000, Tue Jul 14 21:27:26 2015, 0000b
fc, C:\Windows\SYSTEM32\api-ms-win-crt-convert-l1-1-0.dll </module>
  <module>  00007FFA08F50000, 00007FFA08F53000, Tue Jul 14 21:27:26 2015, 00010
9b, C:\Windows\SYSTEM32\api-ms-win-crt-time-l1-1-0.dll </module>
  <module>  00007FFA08F40000, 00007FFA08F44000, Tue Jul 14 21:27:26 2015, 0000a
4d, C:\Windows\SYSTEM32\api-ms-win-crt-runtime-l1-1-0.dll </module>
  <module>  00007FFA08F30000, 00007FFA08F33000, Tue Jul 14 21:27:25 2015, 0000a
86, C:\Windows\SYSTEM32\api-ms-win-crt-filesystem-l1-1-0.dll </module>
  <module>  00007FFA07B10000, 00007FFA07B15000, Tue Jul 14 21:27:25 2015, 00013
16, C:\Windows\SYSTEM32\api-ms-win-crt-multibyte-l1-1-0.dll </module>
  <module>  00007FFA07B00000, 00007FFA07B03000, Tue Jul 14 21:27:26 2015, 0000d
73, C:\Windows\SYSTEM32\api-ms-win-crt-utility-l1-1-0.dll </module>
  <module>  00007FFA02720000, 00007FFA02725000, Tue Jul 14 21:27:26 2015, 00014
29, C:\Windows\SYSTEM32\api-ms-win-crt-math-l1-1-0.dll </module>
  <module>  00007FFA02550000, 00007FFA02553000, Tue Jul 14 21:27:25 2015, 0000b
dc, C:\Windows\SYSTEM32\api-ms-win-crt-locale-l1-1-0.dll </module>
  <module>  00007FFA01940000, 00007FFA01943000, Tue Jul 14 21:27:26 2015, 00005
c1, C:\Windows\SYSTEM32\api-ms-win-crt-environment-l1-1-0.dll </module>
  <module>  00007FFA21670000, 00007FFA217BB000, Fri Sep  8 13:13:16 2017, 00150
9b, C:\Windows\system32\GDI32.dll    </module>
  <module>  00007FFA21310000, 00007FFA21364000, Tue Oct 28 20:52:51 2014, 0005b
27, C:\Windows\system32\SHLWAPI.dll  </module>
  <module>  00007FFA22E30000, 00007FFA22E66000, Tue Oct 28 21:23:43 2014, 0003a
b5, C:\Windows\system32\IMM32.dll    </module>
  <module>  00007FFA1F530000, 00007FFA1F659000, Tue Oct 10 12:39:30 2017, 00128
f2, C:\Windows\SYSTEM32\UxTheme.dll  </module>
  <module>  00007FFA21260000, 00007FFA2130A000, Tue Oct 28 22:50:38 2014, 000b0
b4, C:\Windows\system32\msvcrt.dll   </module>
  <module>  00007FFA21380000, 00007FFA213D9000, Fri Mar 20 00:08:34 2015, 00062
fd, C:\Windows\SYSTEM32\sechost.dll  </module>
  <module>  00007FFA22CF0000, 00007FFA22E30000, Thu Mar 31 00:13:42 2016, 0014f
8a, C:\Windows\system32\RPCRT4.dll   </module>
  <module>  00007FFA23150000, 00007FFA23362000, Sun Apr 16 03:41:51 2017, 0021b
31, C:\Windows\SYSTEM32\combase.dll  </module>
  <module>  00007FFA21370000, 00007FFA21379000, Tue Oct 28 22:48:43 2014, 00007
6b, C:\Windows\system32\NSI.dll      </module>
  <module>  00007FFA23420000, 00007FFA23571000, Sat Sep  9 12:16:52 2017, 00152
3d, C:\Windows\system32\MSCTF.dll    </module>
  <module>  00007FFA20BD0000, 00007FFA20BFE000, Tue Oct 28 21:29:54 2014, 0002c
2a, C:\Windows\system32\SspiCli.dll  </module>
  <module>  00007FFA01840000, 00007FFA01934000, Tue Sep  5 03:19:44 2017, 000ff
89, C:\Windows\SYSTEM32\ucrtbase.DLL </module>
  <module>  00007FFA01790000, 00007FFA01834000, Fri Apr 24 22:34:22 2015, 000a1
4e, C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_
.82.9600.17810_none_34ae2abd958aedeb\Comctl32.dll </module>
  <module>  00007FFA1F690000, 00007FFA1F69B000, Tue Oct 28 21:27:02 2014, 00014
cc, C:\Windows\SYSTEM32\kernel.appcore.dll </module>
  <module>  00007FFA015F0000, 00007FFA01779000, Tue Mar 31 23:45:14 2015, 00178
26, C:\Windows\system32\dbghelp.dll  </module>
  <!--                         -->
  <!-- Call stack information  -->
  <!--                         -->
  <frame>
     <pc> 00007FFA01857D12, strcpy+22 (C:\Windows\SYSTEM32\ucrtbase.DLL) </pc>
     <source> Source file unknown. Reason 0x1e7 </source>
  </frame>
  <frame>
     <pc> 00007FF646C986A7 (XXXXX.exe) [000001e7] </pc>
  </frame>
  <frame>
     <pc> 00007FF646C9F32C (XXXXX.exe) [000001e7] </pc>
  </frame>
  <frame>
     <pc> 00007FF646C87005 (XXXXX.exe) [000001e7] </pc>
  </frame>
  <frame>
     <pc> 00007FF646C8305E (XXXXX.exe) [000001e7] </pc>
  </frame>
  <frame>
     <pc> 00007FF646CBFF18 (XXXXX.exe) [000001e7] </pc>
  </frame>
  <frame>
     <pc> 00007FFA235813D2, BaseThreadInitThunk+22 (C:\Windows\system32\KERNEL3
.DLL) </pc>
     <source> Source file unknown. Reason 0x1e7 </source>
  </frame>
  <frame>
     <pc> 00007FFA237554F4, RtlUserThreadStart+34 (C:\Windows\SYSTEM32\ntdll.dl
) </pc>
     <source> Source file unknown. Reason 0x1e7 </source>
  </frame>
/exception>






























解决方案

I'm actually surprised that worked in the first place.

You are casting a 64 bit pointer to a UINT, which is a 32 bit variable. Basically you are cutting off half of the variable and somehow expecting it to work.

This is a major type error and if it wasn't for the cast then it wouldn't compile.

If you are still wondering why this is such a problem. Take a very small sample program:

#include <new>
#include <Windows.h>

int wmain()
{
	char *c = new char;
	char *d;

	d = reinterpret_cast<char *>(PtrToUlong(c));

	return 0;
}

Where does this allocate the memory?

Well, in one sample run of this code new returned the pointer:

0x00000146,b0740850

I used commas to separate it into 4 bytes. Now, if we follow on and then actually look at what d gets set to, it is:

0x00000000,b0740850

do you notice how it has completely changed the value of the pointer so it points at a completely different block of memory? Yes, by using PtrToUlong you hacked off the upper 4 bytes of the pointer corrupting it.

You are never able to cast a pointer to a smaller size, and PtrToUlong hides the compiler warning that you should get when you shrink it. If you replace PtrToUlong with a cast:

d = reinterpret_cast<char *>(reinterpret_cast<unsigned long>(c));

which is what the PtrToUlong function essentially does, you can see it in the Windows headers itself:

__inline
unsigned long
PtrToUlong(
    const void  *p
    )
{
    return((unsigned long) (ULONG_PTR) p );
}

you should get the warnings:

1>c:\users\archa\source\repos\meh\source\main.cpp(9): warning C4311: 'reinterpret_cast': pointer truncation from 'char *' to 'unsigned long'
1>c:\users\archa\source\repos\meh\source\main.cpp(9): warning C4302: 'reinterpret_cast': truncation from 'char *' to 'unsigned long'
1>c:\users\archa\source\repos\meh\source\main.cpp(9): warning C4312: 'reinterpret_cast': conversion from 'unsigned long' to 'char *' of greater size

These should get these unless you have disabled warnings completely since they are level 1 and level 2 warnings.

So TL;DR PtrToUlong will unconditionally corrupt 64 bit pointers. You must never use it unless you want to write broken applications that could only ever work due to luck.


这篇关于c0000005(ACCESS_VIOLATION)从VS 2010迁移到VS 2017后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆