&引用;这";lambda捕获的数据不正确。GCC编译器错误? 过去几天,我一直在调试一个涉及C++中的lambda的奇怪问题。我已将问题归结为以下症状: 此指针在lambda内部损坏(注意:此始终由副本捕获,因此lambda应该拥有自己的此指针,该指针指向应用程序对象) 仅当存在std::coutprint语句并且在创建lambda之前调用该语句时才会发生。print语句可能看起来完全不相关(例如,打印“Hello!”)printf()也表现出相同的行为 它仅在交叉编译时出现 它使用标准的x86体系结构编译器进行编译并运行良好(请参阅) 如果我在堆上创建lambda(并将指向它的指针保存在App对象中),则不会发生错误 如果关闭优化,则不会出现此错误(即,如果我设置了-O0标志)。当优化设置为-O2时发生

&引用;这";lambda捕获的数据不正确。GCC编译器错误? 过去几天,我一直在调试一个涉及C++中的lambda的奇怪问题。我已将问题归结为以下症状: 此指针在lambda内部损坏(注意:此始终由副本捕获,因此lambda应该拥有自己的此指针,该指针指向应用程序对象) 仅当存在std::coutprint语句并且在创建lambda之前调用该语句时才会发生。print语句可能看起来完全不相关(例如,打印“Hello!”)printf()也表现出相同的行为 它仅在交叉编译时出现 它使用标准的x86体系结构编译器进行编译并运行良好(请参阅) 如果我在堆上创建lambda(并将指向它的指针保存在App对象中),则不会发生错误 如果关闭优化,则不会出现此错误(即,如果我设置了-O0标志)。当优化设置为-O2时发生,c++,c++11,lambda,arm,compiler-bug,C++,C++11,Lambda,Arm,Compiler Bug,下面是我能想到的导致问题的最简单的可编译代码示例 #include <iostream> #include <functional> class App { public: std::function<void*()> test_; void Run() { // Enable this line, ERROR is printed // Disable this line, app runs o.k.

下面是我能想到的导致问题的最简单的可编译代码示例

#include <iostream>
#include <functional>

class App {

public:

    std::function<void*()> test_;

    void Run() {

        // Enable this line, ERROR is printed
        // Disable this line, app runs o.k.
        std::cout << "This print statement causes the bug below!" << std::endl;

        test_ = [this] () {
            return this;
        };

        void* returnedThis = test_();
        if(returnedThis != this) {
            std::cout << "ERROR: 'this' returned from lambda (" << returnedThis 
                      << ") is NOT the same as 'this' (" << this << ") !?!?!?!?!"
                      << std::endl;
        } else {
            std::cout << "Program run successfully." << std::endl;
        }

    }
};

int main(void) {
    App app;
    app.Run();
}
如果我尝试取消引用损坏的
this
,我通常会遇到分段错误,这就是我第一次发现错误的原因

编译器设置 链接器设置 编译器版本
这可能是一个编译器错误吗?

听起来像以下编译器错误:(它只影响使用O1优化或更高版本生成的代码)。

这似乎是gcc 6.2中的一个编译器错误,请参阅:

解决办法:

  • 使用
    -fno-schedule-insns2
    标志(正如gbmhunter所指出的,请参见下面的注释)
  • 不要使用
    -O2
    优化或更高版本

仅当std::cout print语句存在大量UB标志时才会发生(我过去的成功率约为100%),请尝试根据valgrindFirst经验法则运行您的程序-它从来都不是编译器错误,代码中总是UB。(我发现了一个编译器错误。)你能把变量
test
的声明移到
Run
的主体中吗?如果是这样,是否可以将
Run
的主体移动到
main()
?如果更改
void*returnedThis=test()至<代码>无效*返回此=静态施法(此)
你得到了同样的结果吗?如果你用
自动测试代替
std::function
({returnthis;})(因此
测试
属于lambda类型,而不是转换为
std::function
)错误是否仍在复制?@gbmhunter开始让我觉得像个错误。至少有足够的人认为打开一个GCC错误报告是合理的。您已经收集了相当多的工作/不工作变体的相关示例,应该可以编写一份高质量的bug报告,并确认这是一个bug,或者很有可能解释为什么不是(如果是这样的话)。如果您确实打开了一个bug,请在问题中添加一个链接,以便我们跟进。感谢您提供的信息!我将在未来3天左右对此进行调查以确认,如果是,我将接受这个答案:-)我实际上没有时间进行充分验证(即仔细检查汇编代码并与记录的错误进行比较)。但是,由于它与这个bug描述完全匹配(例如,在较旧版本的GCC上,只在优化O1或更高版本时出现,并且会破坏堆栈),我接受这个答案。非常感谢。我真的不认为这是。。。。1.我已经应用了补丁,但仍然失败。2.该bug位于内置返回地址()中。。。“我看不出这与这个问题有什么关系。”约翰卡特耶斯说。请看Philipp Huppertz的回答,我相信他找到了正确的错误。谢谢!这似乎就是问题所在。如链接邮件列表中所述,添加标志
-fno-schedule-insns2
(禁用指令调度)也可以解决此问题。这允许您将优化级别保持在
-O2
-O3
(注意
-fno-schedule-insns2
仍可能影响代码的速度)。
This print statement causes the bug below!
ERROR: 'this' returned from lambda (0xbec92dd4) is NOT the same as 'this' 
(0xbec92c68) !?!?!?!?!
arm-poky-linux-gnueabi-g++ -march=armv7-a -marm -mfpu=neon -std=c++14 \
-mfloat-abi=hard -mcpu=cortex-a9 \
--sysroot=/home/ghunter/sysroots/cortexa9hf-neon-poky-linux-gnueabi \
-O2 -pipe -g -feliminate-unused-debug-types
arm-poky-linux-gnueabi-ld \
--sysroot=/home/ghunter/sysroots/cortexa9hf-neon-poky-linux-gnueabi \
-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
~$ arm-poky-linux-gnueabi-g++ --version

arm-poky-linux-gnueabi-g++ (GCC) 6.2.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.