当 C++11 应用程序使用非 C++11 库时返回值损坏
Return value corrupt when C++11 application uses non-C++11 library
我有一个没有C++11标志(-std=c++11)的库,还有一个链接到该库的应用程序,该库是用-std=c++11构建的。它调用库中的函数,然后程序在库中崩溃得更深。我发现发生崩溃的函数(这只是一个在类中返回指针的简单函数)的反汇编与调用堆栈源自该程序的时间不同,而不是库的测试程序也不是用 C++11 标志构建的。
操作系统是OS X Mountain Lion,编译器是Clang++。
为什么 C++11 应用程序和非 C++11 库之间不起作用,以及当不同的生成代码位于库中并且因此应该相同时何时生成反汇编?
两种不同的反汇编:
TestApplication`Core::GetPointer() const at System.h:xxx:
0x100009690: pushq %rbp
0x100009691: movq %rsp, %rbp
0x100009694: movq %rdi, -8(%rbp)
0x100009698: movq -8(%rbp), %rdi
0x10000969c: movq 64(%rdi), %rax ;<-------Difference
0x1000096a0: popq %rbp
0x1000096a1: ret
Lib1Prototype`Core::GetPointer() const at System.h:xxx:
0x100019c10: pushq %rbp
0x100019c11: movq %rsp, %rbp
0x100019c14: movq %rdi, -8(%rbp)
0x100019c18: movq -8(%rbp), %rdi
0x100019c1c: movq 40(%rdi), %rax ;<------Difference
0x100019c20: popq %rbp
0x100019c21: ret
在 OS X 使用的 x86-64 ABI 中,函数的第一个参数以 %rdi
传递,函数的返回值以 %rax
传递。 因此,此函数获取指向某个数据结构的指针,并返回从偏移量 64 或 40 开始包含的 64 位值,具体取决于函数的编译方式。
因此,您需要查看定义该数据结构的头文件。 它以不同的方式定义数据结构,具体取决于您是否编译为 C++11。 也许有一些显而易见的东西,比如你知道#ifdef
有不同的定义。 或者,也许有一个成员的类型定义不同。 如果您无法弄清楚,请编辑您的问题并粘贴(通过指针)传递给 Core::GetPointer
函数的数据结构的定义。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- C 11返回值和错误对
- 是否可以检索 C++11 中线程函数的返回值
- 当 C++11 应用程序使用非 C++11 库时返回值损坏
- 内存分配,用于在C 11中循环中函数的返回值:如何优化
- 有没有办法在C++11中匹配返回值
- c++11返回值优化或移动
- C++11-清除返回值语法和decltype关键字
- C++11 - 返回通过左值传递到函数中的右值
- c++ 11本地命名引用返回值(xvalue)