当前位置: 技术问答>linux和unix
为什么函数参数值莫名其妙改变了???
来源: 互联网 发布时间:2015-04-04
本文导语: 请看下面代码片断:当我调用解密函数CPDcrypt的时候传进去7个参数,可以刚刚进入函数之后它的第七个参数值就莫名其妙的改变了,请看看我跟踪这部分代码,就可以发现最后一个参数在进入函数之前&shit=0xbfffddd8,可...
请看下面代码片断:当我调用解密函数CPDcrypt的时候传进去7个参数,可以刚刚进入函数之后它的第七个参数值就莫名其妙的改变了,请看看我跟踪这部分代码,就可以发现最后一个参数在进入函数之前&shit=0xbfffddd8,可是进去之后马上就变成0x804d1bc了,紧接着引用这个参数时就出现越界而segment fault了。我实在是不明白为什么,请高手指点,非常感谢。
2706 DWORD shit=128;
2707 if(CPDecrypt(hProv,
2708 hXchgKey,
2709 NULL,
2710 true,
2711 0,
(gdb) l
2712 pbBuffer,
2713 &shit))
2714 {
2715 printf("decrypt ok in line 2714n");
2716 }
2717 else
2718 {
2719 perror("error decrypt in line 2718!");
2720 }
2721
(gdb) print hProv
$2 = 134557416
(gdb) print hXchgKey
$3 = 134558120
(gdb) print pbBuffer
$4 = (BYTE *) 0x8053cf8 "30-盌?"
(gdb) print shit
$5 = 128
(gdb) print &shit
$6 = (DWORD *) 0xbfffddd8
(gdb) l
2722 file://鐎电厧鍤粔渚?鎸?,閸忓牐骞忛崣鏍х槕闁姐儵鏆辨惔锟?
2723 pbData = NULL;
2724 cbData = 0;
2725 if(!(CPExportKey(hProv,
2726 hSignKey,
2727 NULL, //hKey
2728 PRIVATEKEYBLOB,
2729 0,
2730 pbData,
2731 &cbData)))
(gdb) s
CPDecrypt (hProv=134557416, hKey=134558120, hHash=0, Final=1, dwFlags=0,
pbData=0x8053cf8 "30-盌?", pcbDataLen=0x804d1bc)
2706 DWORD shit=128;
2707 if(CPDecrypt(hProv,
2708 hXchgKey,
2709 NULL,
2710 true,
2711 0,
(gdb) l
2712 pbBuffer,
2713 &shit))
2714 {
2715 printf("decrypt ok in line 2714n");
2716 }
2717 else
2718 {
2719 perror("error decrypt in line 2718!");
2720 }
2721
(gdb) print hProv
$2 = 134557416
(gdb) print hXchgKey
$3 = 134558120
(gdb) print pbBuffer
$4 = (BYTE *) 0x8053cf8 "30-盌?"
(gdb) print shit
$5 = 128
(gdb) print &shit
$6 = (DWORD *) 0xbfffddd8
(gdb) l
2722 file://鐎电厧鍤粔渚?鎸?,閸忓牐骞忛崣鏍х槕闁姐儵鏆辨惔锟?
2723 pbData = NULL;
2724 cbData = 0;
2725 if(!(CPExportKey(hProv,
2726 hSignKey,
2727 NULL, //hKey
2728 PRIVATEKEYBLOB,
2729 0,
2730 pbData,
2731 &cbData)))
(gdb) s
CPDecrypt (hProv=134557416, hKey=134558120, hHash=0, Final=1, dwFlags=0,
pbData=0x8053cf8 "30-盌?", pcbDataLen=0x804d1bc)
|
你在开发过程中是否改过函数原型?你的库和主程序使用的头文件一致吗?把库和主程序全部重新编译一遍看看。
|
你的cbData是栈型的变量么?如果是全局变量或者静态变量,地址当然不是0xbffff???了!你用DWORD shit=128;声明shit变量,是在栈中声明的,所以是0xbfffddd8,而且你的cbData和shit根本就不是一个变量,你说的“最后一个参数在进入函数之前&shit=0xbfffddd8,可是进去之后马上就变成0x804d1bc了”,我实在是不明白。