android ndk非对齐内存访问导致BUS_ADRALN

在Android开发中,遇到ARM架构设备因非对齐内存访问引发的SIGBUS错误,具体表现为'BUS_ADRALN'。ARM指令通常要求4字节对齐,而Thumb指令同样如此。不同CPU对非对齐内存访问处理方式不同,可能导致程序崩溃或数据异常。举例说明,8字节的long long非对齐访问在某些CPU上会导致崩溃,而4字节的int非对齐访问可能被处理。为避免问题,应确保正确对齐内存访问。
摘要由CSDN通过智能技术生成

工作中arm架构手机程序遇到崩溃,查看android logcat,显示“signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0xab6b1f3a”,这是典型的c++非对齐内存访问导致的崩溃。

在ARM中,有ARM和Thumb两种指令。  
ARM指令:CPU每执行一条指令,PC的值加4个字节(32bits),一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置。  
Thumb指令:CPU每执行一条指令,PC的值加4个字节(32bits),一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上。

在大多数情况下,对齐是编译器和CPU的事情,和程序员没什么关系。但在某些情况下,程序员又必须考虑对齐问题,否则会有一些麻烦。如果程序员在非对齐内存访问,可能会导致数据读取异常或崩溃,为什么说可能呢,因为有些CPU有对非对齐内存访问做了保护和处理,有些则没有。为了更直观地说明这个问题,请看下面的两个例子。

例子1:非对齐内存访问long long(8字节)

const int payloadlen = 16;
unsigned char* payload = new unsigned char[payloadlen];
for (int i = 0; i < payloadlen; i++)
	payload[i] = i;
for (int i = 0; i < payloadlen - sizeof(long long); i++)
{
	long long* plonglong = (long long*)(payload + i);
	pr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值