lambda捕获的“this”不正确。GCC编译器错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (406)

我一直在调试一个涉及C ++ lambda表达式的奇怪问题。我已将问题简化为以下症状:

  • this指针被破坏拉姆达内(注:this总是被复制捕获,因此拉姆达应该得到自己的this指针,它指向的App对象)
  • 它只有在std::cout打印语句存在时才会发生,并且在创建lambda之前调用。打印语句可能看似完全不相关(例如,打印“Hello!”)。printf()也表现出相同的行为。
  • 它只发生在交叉编译时。
  • 它使用标准的x86架构编译器进行编译和运行。
  • 如果我在堆上创建lambda表达式(并在App对象内部保存一个指针),则不会发生该错误。
  • 如果优化关闭(即,如果我设置-O0标志),则不会发生该错误。它在优化设置为时发生-O2

以下是我可以想到的最简单,可编译的代码示例,可以解决问题:

#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 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.

这可能是一个编译器错误?

提问于
用户回答回答于

所属标签

可能回答问题的人

  • 找虫虫

    0 粉丝0 提问6 回答
  • 爸爸

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • 优惠活动秘书

    0 粉丝2 提问4 回答
  • 人生的旅途

    10 粉丝484 提问4 回答

扫码关注云+社区

领取腾讯云代金券