为啥这段代码在 HPUX 上会崩溃?

Posted

技术标签:

【中文标题】为啥这段代码在 HPUX 上会崩溃?【英文标题】:Why does this code crash on HPUX?为什么这段代码在 HPUX 上会崩溃? 【发布时间】:2015-02-17 05:54:24 【问题描述】:

我编写了一个类似于我在项目中面临的问题的小程序。问题是,为什么它在 HP-UX 平台上运行时会崩溃?

错误:

si_code: 1 - BUS_ADRALN - 无效的地址对齐

代码:

int main()

    uint8_t *cmd ;
    cmd = (uint8_t *) malloc(77);
    uint32_t gen = 20; 
    *(uint32_t*)&cmd[10] = gen;  /* crash here */
    return 0;

【问题讨论】:

what does "BUS_ADRALN - Invalid address alignment" error means?的可能重复 (uint32_t)&cmd[11] = gen; /* 在这里崩溃 */ --> 你可以试试“11”而不是“10”吗? 它以同样的方式崩溃 11。 @ManojHirway 12 号怎么样? 为了使cmd[10] 与 32 位对齐,cmd 必须与 16 位对齐而不是与 32 位对齐。如果不是这种情况,AND 您的平台(即底层硬件架构 + 指定编译器)不支持未对齐的加载/存储操作,那么此操作将产生未定义的行为。如果你很幸运,那么它会立即崩溃并“让你知道”这条线有问题。如果你不走运,那么它只会将一个值存储到cmd 内的不同偏移量中,并且程序会出现意外行为。 【参考方案1】:

&cmd[10] 未正确对齐以存储 32 位整数 - 因为 cmd 的每个元素都是一个字节长,malloc 返回的地址对于“任何类型”正确对齐,即第 11 个元素cmd 不会位于可被 4 整除的地址。

【讨论】:

谢谢。但是,当我们将其类型转换为 (uint32_t *)&cmd[10] 时,我们不是指的是 4 字节吗? @ManojHirway 通过强制转换,您将数据视为uint32_t,编译器生成适用于该类型的代码,而不是适用于“任何 4 个字节一起”的代码......所以对齐要求uint32_t 的来玩。 (如果您启用了-Wcast-align,clang 编译器实际上会在您的代码中生成有关此行的警告。)

以上是关于为啥这段代码在 HPUX 上会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

函数指针 - 为啥这段代码会崩溃?

为啥这段代码在 iOS 5.1 中会崩溃,而在 iOS 6 中不会?

为啥我的 Javascript 在 iOS 上会中断?

为啥这段代码在运行时会崩溃?它只是选项卡式视图中 SwiftUI 中的选择器

Swift 4 相机视图,为啥这会在 iPad 而不是 iPhone 上崩溃?

为啥这段代码不能用 clang 构建,用 gcc 崩溃,但用 VC++ 运行良好? [复制]