gpt4 book ai didi

c++ - 使遗留代码 x64 兼容时出现非法读/写错误

转载 作者:太空狗 更新时间:2023-10-29 23:19:53 24 4
gpt4 key购买 nike

我有以下 MyType::Is_Inst () 函数,它在 64 位模式而非 32 位模式下返回时抛出无效内存访问错误:

MyType MyType::Is_Inst () {
unsigned char Bar=0;
MyType Foo={0};
return Foo;
}

看反汇编+单步执行,程序崩溃在该行

mov  dword ptr [rax],ecx

...当程序基本上试图取消引用 %rdx 的原始值(从第一次调用函数时开始),现在在 %rax 中。但是,%rdx 只是前一个函数调用遗留下来的垃圾。

上次我遇到这样的问题,是因为我缺少一些编译标志之类的。对于 x64 非托管 C++ 项目,有什么我应该注意的设置吗?我可能会看到此行为还有其他原因吗?

如果您需要,我可以发布更多反汇编。


MyType 的类定义如下所示:

class __declspec(dllexport) MyType {
public:
union {
struct {
unsigned int Id : 23;
unsigned int Flag : 1;
unsigned int Type : 4;
unsigned int Unused : 4; /* 32 bits total */
};

unsigned int All_Bits; /* Full 32 bits of MyType */
};

/* There are some function definitions here, but no other
variables, aside from some statically defined ones. */
};

更新:这是 Is_Inst() 反汇编的更简洁、优化的版本,它显示了问题。为简洁起见,我删除了之前的旧版本。

// MyType MyType::Is_Inst () {
// uchar Bar=0;
// MyType Foo={0};
mov dword ptr [rdx],0 /* %rdx is 0x17, from a prev fn call. */

// return Foo;
mov rax,rdx
// }
ret

导致调用 Is_Inst() 的代码:

...
for (Counter=0; Counter<N_Items; Counter++) {
...
myOther32BitType = arrayOfMyOtherTypes [Counter]; /* Debugger shows this is ok. */

if (myOther32BitType.8BitField==UNEQUAL_ENUM_VALUE) {
/* Some stuff that doesn't happen. */
}

/* myOther32BitType.8BitField==0x17, so %rdx gets set to 0x17. */
else if (strchr((char*)Uchar_Table_Of_Enum_Values, myOther32BitType.8BitField)) continue;

/* %rdx gets set to 0x17 again. */
else if (strchr((char*)Other_Uchar_Table_Of_Enum_Values, myOther32BitType.8BitField)) continue;

else if ( myOther32BitType.8BitField==EQUAL_ENUM_VALUE) {
if (myType.Is_Inst ().All_Bits) { /* Is_Inst() called here. */
return false;
}
...
}
...
}

最佳答案

关于c++ - 使遗留代码 x64 兼容时出现非法读/写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6258052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com