C++ arm上的boost crc优化失败

C++ arm上的boost crc优化失败,c++,gcc,boost,arm,C++,Gcc,Boost,Arm,我有一个为x86和arm(rpi2)编译的程序。我使用boost实现crc,但在arm平台上遇到了一个问题 调试后,我发现arm上的crc计算是关闭的。我编写了这些小测试用例来找出问题: namespace { unsigned char const data[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 }; std::size_t const data_len = sizeof(data) / s

我有一个为x86和arm(rpi2)编译的程序。我使用boost实现crc,但在arm平台上遇到了一个问题

调试后,我发现arm上的crc计算是关闭的。我编写了这些小测试用例来找出问题:

namespace
{
    unsigned char const  data[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 };
    std::size_t const    data_len = sizeof(data) / sizeof(data[0]);
    uint16_t const expected = 0x29B1;
}

BOOST_AUTO_TEST_CASE(test_non_optimized){
    boost::crc_basic<16>  crc_basic(0x1021, 0xFFFF, 0, false, false);
    crc_basic.process_bytes(data, data_len);

    BOOST_CHECK_EQUAL(crc_basic.checksum(), expected);
}


BOOST_AUTO_TEST_CASE(test_optimized) {
    boost::crc_optimal<16, 0x1021, 0xFFFF, 0, false, false> crc_optimal;
    crc_optimal.process_bytes(data, data_len);

    BOOST_CHECK_EQUAL(crc_optimal.checksum(), expected);
}

BOOST_AUTO_TEST_CASE(test_function) {
    uint16_t checksum = boost::crc<16, 0x1021, 0xFFFF, 0, false, false>(data, data_len);
    BOOST_CHECK_EQUAL(checksum, expected);
}
Boost版本1.63.0

编译器:gcc(gcc)6.3.1 20170109


我很惊讶在boost中遇到这样的事情。你知道是什么引起的吗?

事实证明,问题只存在于-O3中。不含-O2或更低


此外,将gcc升级到7.1.1 20170516也解决了这个问题。即使使用-O3,“解决了问题”或“消除了症状”?它可能仍然是未定义的行为。如果有人想在启用消毒剂的情况下轻松运行此操作:好的,输入正确。我所知道的是,现在这个程序似乎可以运行了,以前在各个地方失败的大约40个测试用例现在都通过了。也就是说。我真的不知道如何解释sanitize标志的输出。你是说继续使用O3和boost crc功能是不安全的吗?我不希望有UB。但是有一个很小的机会,代码实际上正在做一些令人讨厌的事情。我将尝试检查(关于在Linux或Windows上获取ARM工具链的任何提示?)好的,谢谢!我使用的是arch linux,但我还没有设置完整的交叉编译器。我们要做的是让构建服务器在一个真正的rpi2上运行一个代理,然后在虚拟x86机器上运行几个distcc从机,并根据这一点为arm交叉编译。有些文件无法在从机上构建,然后在本机体系结构上重新编译。无论如何。链接页面上的armv7h ng工具链就是我们使用的。
test/boost_crc_test.cpp(41): check crc_optimal.checksum() == expected has failed [29299 != 10673]
test/boost_crc_test.cpp(46): check checksum == expected has failed [29299 != 10673]