for循环使用如下代码遍历链表时,发现会被编译器优化成死循环,链表结尾值为null.for (p = n->next, n = p->next; p != 0; p = n, n = p->next)这段代码即使p=0,也不会退出循环。这是处于什么考虑才这么优化?
Hi SML,
如果你用的是e2studio的话,是使用的gcc12.2.1的工具链,默认编译优化是-O2,如果你怀疑是编译器优化的问题的话,你可以试着将编译器优化等级从-O2改为-O1或者-O0,看看问题是否还会复现。
NP_Renesas
改为O0是正常的,O1就会出现问题,同样的代码,使用ARMCC编译没有问题。
从汇编上看,确实是翻译成无条件跳转指令了,我需要确认这种写法触发了哪种优化条件,导致最终代码变为无条件转移指令
Hi SML,
e2studio使用的都是gcc官方工具链,关于gcc的优化等级,主要是不同优化等级会添加不同的编译参数,具体优化等级和编译参数的关联可以参考官方文档或者网络上的博客。