2017-08-10 2 views
1

x86とarm(rpi2)の両方でコンパイルしたプログラムがあります。私はcrcの実装のためのブーストを使用しており、アームプラットフォームでそれに失敗する問題があります。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); 
} 

この3つのテストケースはいずれもx86に合格しています。しかし、腕ではcrc_basicテストだけが成功します。他の2つは失敗します。

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(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

ok、良い入力。私が知っていることは、今ではプログラムが動作しているように見え、以前はさまざまな場所で失敗した〜40のテストケースがすべてパスしているということです。それは言った。私は実際にはサニタイズフラグからの出力をどのように解釈するのか分かりません。 O3とboost crc関数を使い続けることは危険だと私に伝えていますか? – tkarls

関連する問題