前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >__int128类型movaps指令crash

__int128类型movaps指令crash

作者头像
mingjie
发布2023-11-23 10:09:45
3030
发布2023-11-23 10:09:45
举报

结论

在使用__int128时,如果__int128类型的内存起始地址不是按16字节对齐的话,有些汇编指令会抛出SIGSEGV使程序crash。

malloc在64位系统中申请的内存地址,是按16字节对齐的,但一般使用时经常会申请一块内存自己切割使用,往往会忽略一些类型的对齐。

案例

目前知道的两个指令是msse指令集的movaps和vmovaps,都是用来给int128赋值的,例如下面两种场景:

  1. (访问rax+0x30地址即 0x328dba8 + 0x30 = 0x328dbd8,对齐8字节,但没对齐16字节)
在这里插入图片描述
在这里插入图片描述
  1. (访问rax+0x30地址即 0x2d20b48 + 0x20 = 0x2d20b68,对齐8字节,但没对齐16字节)
在这里插入图片描述
在这里插入图片描述

复现

代码语言:javascript
复制
#include <stdio.h>

// gcc -g -O2 -Wall -msse4.2 -o test test.c

// core
typedef unsigned __int128 uint128;

// no core
// typedef unsigned __int128 uint128 __attribute__((aligned(8)));

static char mem[100];

typedef struct MySt
{
	int a;
	uint128 i;
	int b;
} MySt;

int main(void)
{
	MySt *st = (MySt *)(mem + 1);
	printf("st = %p\n", st);
	printf("st->i = %p\n", &st->i);
	__int128 tmp = 123123;
	st->a = 0;
	st->i = tmp * 123;
	st->b = 0;
	st = st;
	return st->i + 1 == 123;
}

gcc -g -O2 -Wall -msse4.2 -o test test.c可复现(不同的机器、编译器版本有不同的效果,可以看下编出来的二进制有无movaps指令,如果都是mov肯定没问题)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结论
  • 案例
  • 复现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档