如何知道从我的机器上的未对齐内存地址读取是否安全?

时间:2016-02-04 18:16:19

标签: c linux amazon-ec2 memory-alignment

我知道根据C标准,不允许执行未对齐的内存读取,因为它可能会导致SIGBUS

尽管如此,我已经看到一些机器,这不是问题。

如何知道从我的机器上的未对齐内存中读取是否安全?更具体地说,我使用的是亚马逊Linux。

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               800.000
BogoMIPS:              7981.41
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

2 个答案:

答案 0 :(得分:4)

重点是,在大多数情况下,未对齐的访问权限是undefined behavior(如果您声称代码是可移植的,符合标准的C或C ++代码)。

未定义的行为始终是very bad ,并且它有一些令人不快的属性,有时它看起来似乎有效(因此有一些程序显然无法正常工作;它可能会在下次破坏)。

实际上,在接受未对齐访问的当前机器上(可能是许多x86_64处理器),这样的访问非常慢因为它们使CPU cache不满意(需要两次内存读取)硬件水平)。另请参阅this

只需避免未对齐访问(以及其他形式的UB,包括buffer overflows)。尝试编写标准代码,并遵循常规实践和智慧。启用编译器中的所有警告,并尝试不能获得单个警告。有关更多建议,请再次查看this link

答案 1 :(得分:2)

它会"工作"在你描述的环境中? "是",(性能损失。)

安全吗?如果你蒙着眼睛穿过一条繁忙的街道并安全地到达另一边,那是不是很安全"?