1
我有一個程序,我編譯x86和arm(rpi2)。我正在使用boost來實現crc,並且在arm平臺上出現問題。boost crc優化在手臂上失敗
調試結束後,我發現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]
加速版本1.63.0
編譯器:GCC(海灣合作委員會)6.3.1 20170109
我很吃驚遇到這樣的事情與提升。任何想法是什麼導致這個?
「解決了問題」或「解除了症狀」?它可能仍然是未定義的行爲。 – sehe
如果任何人想輕鬆運行此消毒殺菌器啓用:http://coliru.stacked-crooked.com/a/d13bb5ff9fb1f7ad – sehe
好的,很好的輸入。我所知道的是,現在該程序似乎能夠工作,並且在各個地方失敗的大約40個測試用例現在都已通過。這就是說。我真的不知道如何解釋sanitize標誌的輸出。你是否告訴我繼續使用O3和boost crc函數是不安全的? – tkarls