【问题标题】:C++ function argument losing part of addressC++ 函数参数丢失部分地址
【发布时间】: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++


【解决方案1】:

因此问题很可能(或至少在表面上)是由 WinDbg 为这些函数设置断点引起的。

我测试了代码(编译的二进制文件),没有在 WinDbg 中设置任何断点,系统没有崩溃。我测试了调试和发布版本,都通过了,没有问题。

为什么/如何? WinDbg 不知何故弄乱了地址,或者 WinDbg 放大了一个深层次的隐藏问题?有没有人解决过类似的经历?

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 2020-12-03
    • 2021-03-06
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多