使用-O2时出现ARM GCC硬故障

使用-O2时出现ARM GCC硬故障,gcc,optimization,arm,Gcc,Optimization,Arm,使用优化级别为-O2(及以上)的ARM GCC g++编译器时,此代码: void foo(void) { DBB("@0x%08X: 0x%08X", 1, *((uint32_t *)1)); DBB("@0x%08X: 0x%08X", 0, *((uint32_t *)0)); } 汇编至: 0800abb0 <_Z3foov>: 800abb0: b508 push {r3, lr} 800abb2: 2301

使用优化级别为-O2(及以上)的ARM GCC g++编译器时,此代码:

void foo(void)
{
    DBB("@0x%08X: 0x%08X", 1, *((uint32_t *)1));
    DBB("@0x%08X: 0x%08X", 0, *((uint32_t *)0));
}
汇编至:

0800abb0 <_Z3foov>:
 800abb0:   b508        push    {r3, lr}
 800abb2:   2301        movs    r3, #1
 800abb4:   4619        mov r1, r3
 800abb6:   681a        ldr r2, [r3, #0]
 800abb8:   4802        ldr r0, [pc, #8]    ; (800abc4 <_Z3foov+0x14>)
 800abba:   f007 fa83   bl  80120c4 <debug_print_blocking>
 800abbe:   2300        movs    r3, #0
 800abc0:   681b        ldr r3, [r3, #0]
 800abc2:   deff        udf #255    ; 0xff
 800abc4:   08022704    stmdaeq r2, {r2, r8, r9, sl, sp}
编译器版本:

arm-none-eabi-g++.exe (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]
您可以使用
-fno delete null pointer checks

您传递的指针有一个与空指针匹配的值,编译器可以从静态分析中看到这一点,因此它会出错(因为这是定义的行为)


在第二个示例中,静态分析没有识别空值。

您认为它是什么指令?看起来未定义。我今天在编写引导加载程序时遇到了这个问题。在我的情况下,我正在访问flash地址0x0的应用程序。由于
-Os
优化,正在调试版本中工作,但未在发布版本中工作。将
-fno delete null指针检查添加到发布版本中是修复方法!
arm-none-eabi-g++.exe (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]