boost crc优化失败

时间:2017-08-10 09:57:56

标签: c++ gcc boost arm

我有一个程序,我为x86和arm(rpi2)编译。我正在使用boost来实现crc,并且在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);
}

所有三个测试用例都在x86上传递。但只有crc_basic测试通过。另外两个失败了:

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]

Boost版本1.63.0

编译:gcc(GCC)6.3.1 20170109

我很惊讶地发现这样的事情。关于导致这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

好吧,事实证明问题只出现在-O3上。不是-O2或更低。

此外,将gcc升级到7.1.1 20170516也解决了这个问题。即使使用-O3