C++ for 循环测试被错误地优化掉了

问题描述 投票:0回答:1

在重载模板类的构造函数内,我有以下 for 循环。原始循环更复杂,但我删除了除

x
之外的所有变量,这些变量在调试过程中进行有用的计算,以便在较大的结构中获得最小的示例。这是目前的情况:

for (int x = 8-1; x >= 0; x--)
{
    std::cout << x << "-";
    if (x < 0) break;
}

当我运行此命令时,它会打印:

7-6-5-4-3-2-1-0--1--2--3--4--5--6--7--8--9--10--11-
(...)

调试器显示反汇编(ARM)为:

    0x102aeef74 <+100>: mov    x0, x19
    0x102aeef78 <+104>: mov    x1, x20
    0x102aeef7c <+108>: bl     0x102bbb1f4               ; symbol stub for: std::__1::basic_ostream<char, std::__1::char_traits<char>>::operator<<(int)
    0x102aeef80 <+112>: mov    x1, x21
    0x102aeef84 <+116>: mov    w2, #0x1
    0x102aeef88 <+120>: bl     0x102acfbc8               ; std::__1::__put_character_sequence[abi:v160006]<char, std::__1::char_traits<char>> at ostream:753
    0x102aeef8c <+124>: sub    w20, w20, #0x1
->  0x102aeef90 <+128>: b      0x102aeef74               ; <+100> at LexPermutationPDB.h:108:13

循环条件似乎正在被优化掉。如果您从上下文中提取代码(例如,仅将循环放入 main 中),则它可以正常工作。我的猜测是,某个地方存在未定义的行为,导致优化效果不佳。

我在 MacOS Ventura 中运行 Xcode 版本 15.2 (15C500b),代码处于发布模式,即

-Os

添加继承自发生问题的类的新类时出现错误。新类重载单个函数并使用不同的构造函数。这个错误是在调用构造函数时发生的,但在父类已经初始化之后。

我打算尝试不同的编译器,但是对于如何追踪问题还有其他想法吗?也许新版本的编译器已经修复了某些问题。

c++ assembly arm
1个回答
0
投票

很有道理。有符号整数不应该溢出或下溢,或者更确切地说——它是 UB。 因此,循环内的条件实际上始终为真。如果是这样,x 永远不会低于零,并且该分支也可以被消除。

考虑尝试使用 unsigned 并打破等于 0xffffffff。

© www.soinside.com 2019 - 2024. All rights reserved.