为什么32位ARM平台上的SIGSEGV故障地址为0x00000006?

Dev*_*Fan 0 c c++ assembly

我在程序中遇到了SEGV_MAPERR崩溃.

pid: 934, tid: 934, name: Binder_1  >>> system_server <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000006
backtrace:
    #00  pc 00000006  <unknown>
    #01  pc 00006925  /system/lib/libcutils.so (set_sched_policy+136)
    #02  pc ffffffff  <unknown>
Run Code Online (Sandbox Code Playgroud)

我可以理解故障地址是0x00000000或0x00000004或其他东西.例如,无效的类虚拟基指针,或无效/野函数指针.

但我无法理解0x00000006作为故障地址.堆栈是非法修改的吗?但是在错误的代码附近,既没有找到返回语句,也没有找到跳转工具.

还有其他潜在的原因吗?非常感谢你!

AnT*_*AnT 6

我不明白你为什么觉得奇怪.这将是尝试6通过空指针在偏移处访问存储器位置的典型结果.例如,如果您在碰巧是空指针时拥有char *string并访问,则通常会在地址处获得段错误.访问并获取地址的段错误(哇!这甚至都不是!!!)这样你可以访问绝对任意的地址并获得它的段错误.string[6]string6string[7]7

(迂腐的东西:......假设空指针由零地址表示并且char与机器字节匹配)

如果段错误是由控制转移到地址引起的6,那么可能有许多不同的原因.例如,通过无效的函数指针执行调用,该指针以某种方式获取值6(未初始化的指针,由附近的缓冲区溢出损坏的指针).或者,存储来自函数的返回地址的堆栈位置可能已被缓冲区溢出和获取的值损坏6,这导致在函数返回时控制转移到地址6.等等等等.

你自己提到"无效/狂野函数指针"作为一个可能的原因.但是为什么你觉得控件转移到地址后会感到意外6呢?无效指针可以获取任意值,不一定在4字节或8字节边界上对齐.