我有一个程序,我为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
我很惊讶地发现这样的事情。关于导致这种情况的任何想法?
答案 0 :(得分:1)
好吧,事实证明问题只出现在-O3上。不是-O2或更低。
此外,将gcc升级到7.1.1 20170516也解决了这个问题。即使使用-O3