2017-08-10 72 views
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

我很吃驚遇到這樣的事情與提升。任何想法是什麼導致這個?

回答

1

那麼,事實證明,問題只出現在-O3。不與-O2或更低。

此外,將gcc升級到7.1.1 20170516也解決了這個問題。即使用-O3

+0

「解決了問題」或「解除了症狀」?它可能仍然是未定義的行爲。 – sehe

+0

如果任何人想輕鬆運行此消毒殺菌器啓用:http://coliru.stacked-crooked.com/a/d13bb5ff9fb1f7ad – sehe

+0

好的,很好的輸入。我所知道的是,現在該程序似乎能夠工作,並且在各個地方失敗的大約40個測試用例現在都已通過。這就是說。我真的不知道如何解釋sanitize標誌的輸出。你是否告訴我繼續使用O3和boost crc函數是不安全的? – tkarls