memcmp函数的问题
char u[3];
char q[3];
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (memcmp(u,q,sizeof(u))==0)
Sleep(1);
}
以上代码在CodeGuard打开的情况下报错
Attempt to access 4 byte(s) at 0x00404619,that is at block 0x00404619...
which is only 3 bytes long.
不知道它为什么会报错?
另外我把数组定义为u[4];q[4];就不会报错。问题出在什么地方?
[解决办法]
重载一个,
void memcmp(u,q,N);
{
for(int i=0;i <N;i++)
{
q[i]=u[i];
}
}
[解决办法]
004029F0 >/. 55 push ebp
004029F1 |. 8BEC mov ebp, esp
004029F3 |. 68 43475300 push 534743
004029F8 |. 83C4 EC add esp, -14
004029FB |. C745 F8 582A4>mov dword ptr [ebp-8], 00402A58 ; ASCII "CGS"
00402A02 |. 8955 E8 mov dword ptr [ebp-18], edx
00402A05 |. 8945 F0 mov dword ptr [ebp-10], eax
00402A08 |. 68 58030000 push 358 ; /Arg2 = 00000358
00402A0D |. FF75 F0 push dword ptr [ebp-10] ; |Arg1
00402A10 |. E8 1F150000 call CG_THIS ; \CG_THIS
00402A15 |. 6A 03 push 3 ; /n = 3给memcmp传入的是3
00402A17 |. 6A 04 push 4 ; |/Arg3 = 00000004
00402A19 |. 68 310E4700 push offset q ; ||Arg2 = 00470E31
00402A1E |. 6A 00 push 0 ; ||Arg1 = 00000000
00402A20 |. E8 FB0D0000 call CG_GDA_EGY ; |\CG_GDA_EGY //第一次CG报错
00402A25 |. 68 310E4700 push offset q ; |s2 = offset Project1.q
00402A2A |. 6A 04 push 4 ; |/Arg3 = 00000004
00402A2C |. 68 2D0E4700 push offset u ; ||Arg2 = 00470E2D
00402A31 |. 6A 00 push 0 ; ||Arg1 = 00000000
00402A33 |. E8 E80D0000 call CG_GDA_EGY ; |\CG_GDA_EGY
00402A38 |. 68 2D0E4700 push offset u ; |s1 = offset Project1.u
00402A3D |. E8 3E0A0000 call memcmp ; \memcmp
00402A42 |. 83C4 0C add esp, 0C
00402A45 |. 85C0 test eax, eax
00402A47 |. 75 07 jnz short 00402A50
00402A49 |. 6A 01 push 1 ; /Timeout = 1. ms
00402A4B |. E8 DA890600 call <jmp.&KERNEL32.Sleep> ; \Sleep
00402A50 |> 896D FC mov dword ptr [ebp-4], ebp
00402A53 |. 8BE5 mov esp, ebp
00402A55 |. 5D pop ebp
00402A56 \. C3 retn
由反汇编可以看出传入给memcmp的确实是3, 在memcmp执行之前CG_GDA_EGY已经报CG错, 所以个人觉得是CG自己的问题, 测试还发现对以下语句.
q[ 0 ] = 'a';
q[ 1 ] = 'b';
q[ 2 ] = 0;
q[ 100 ] = 0;
对前3句都不会在访问前插入CG检查代码, 而第4句CG会加入CG_GDA_EGY检查.. 看来CG处理是根据一些规则决定是否加入判断的.
所以CG只是个工具, 不能对它依赖太高.