如何防止堆栈损坏?

Equ*_*oid 5 c++ gdb android-ndk

我正在尝试在Android本机应用程序中调试segfault。GDB显示以下内容:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 5200]
0xbfcc6744 in ?? ()
(gdb) bt
#0  0xbfcc6744 in ?? ()
#1  0x5cfb5458 in WWMath::unProject (x=2.1136094475592566, y=472.2994384765625, z=0, mvpMatrix=@0x0, 
    viewport=@0x0, result=@0x0) at jni/src/core/util/WWMath.cpp:118
#2  0x00000000 in ?? ()
Run Code Online (Sandbox Code Playgroud)

是否有可能获得良好的筹码?还是找到堆栈损坏的地方?

UPD:提及的功能带有参考:

bool WWMath::unProject(double x, double y, double z, const Matrix &mvpMatrix,
         const Rect& viewport, Vec4& result)
Run Code Online (Sandbox Code Playgroud)

和对简单局部变量的引用作为最后一个参数传递:

Vec4 far, near;
if (!unProject(x, y, 0, tMvp, viewport, near))
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 5

我们没有太多信息可做!没有通用规则可以避免内存损坏,除非要谨慎处理。

但是在我看来,您好像溢出了floats 数组,因为虚假地址0xbfcc6744 等于一个合理的float-1.597,该值与GDB报告的其他值一致。

覆盖返回地址会导致执行跳转到该值,因此,请专门查看该函数的调用程序(WWMath::unProject其局部变量位于其返回地址之前),以查找有问题的缓冲区。(现在我们拥有了near。)