【发布时间】:2013-11-21 19:39:09
【问题描述】:
我在 C++ 中的 Win8x64 驱动程序上遇到了一个非常奇怪的错误(?),导致系统崩溃。
bool funcA(typedef1 arg1, typedef2 arg2)
{
funcB(arg1, arg2);
return true;
}
void funcB(typedef1 arg1, typedef2 arg2)
{
...do something
funcD(....)
....
}
背景信息: - 我确实注意到驱动程序似乎在代码的随机位置崩溃,但没有检查原因。 - 我正在对“funcD()”进行一些更改,与崩溃无关。 - 我用调试编译了二进制文件,并注意到(现在几次)它在“funcB”的开头崩溃。
问题: 问题在于“arg2”的地址。正确的“arg2”地址在“funcA”中,它调用“funcB”。但是一旦进入“funcB”,“arg2”的地址就会被截断。
例如arg2 = 0xffffe000'01ace148 在“funcA”中,然后传递给调用“funcB”。但是在“funcB”内部,它变成了arg2 = 0x00000000'01ace148
我真的不知道这是怎么发生的,所以欢迎任何建议! 不要认为我对下游“funcD”的更改可能会导致这种情况,是吗?
编辑:
两个“typedef”都是指向一些不同结构的指针。
注意“funcA”除了直接用它接收到的完全相同的参数调用“funcB”之外什么都不做。并且 "funcA" 和 "funcB" 具有相同的参数(不同的返回类型),但 "funcA" 接收参数的地址没有问题。
【问题讨论】:
-
你是通过引用还是值传递?
-
我不是驱动专家,但您是否仔细检查过您是否在搞乱调用约定?
-
听起来
funcD正在将数据溢出到不属于它的堆栈区域。悬空指针/引用、数组溢出等 -
我不认为在事件链中的某个地方,您将该指针指向
int并返回? -
希望你没有做一些有罪的事情,比如将地址作为 int 传递。如果我们看到实际的原型,可能会更容易弄清楚。
标签: c++