2017-08-10 7 views
1

J'ai un programme que je compile à la fois pour x86 et arm (rpi2). J'utilise boost pour l'implémentation de crc et ai un problème avec ça échouant sur la plate-forme de bras. Après le débogage, j'ai trouvé que les calculs de crc étaient désactivés sur le bras. J'ai écrit ces petits cas de test pour identifier le problème:boost crc optimisé échoue sur le bras

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); 
} 

Les trois cas de test passent sur x86. Mais sur le bras seulement le test de test crc_basic. Les deux autres échoue:

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] 

version Boost 1.63.0

compilateur: gcc (GCC) 6.3.1 20170109

Je suis assez surpris de tomber sur quelque chose comme ça avec boost. Des idées sur ce qui cause cela?

Répondre

1

Eh bien, comme il s'est avéré que le problème était seulement présent avec -O3. Pas avec -O2 ou moins. En outre, la mise à niveau de gcc vers la version 7.1.1 de 20170516 a également permis de résoudre le problème. Même avec -O3

+0

"Résolu le problème" ou "supprimé le symptôme"? Il pourrait encore être un comportement indéfini. – sehe

+0

Dans le cas où quelqu'un veut facilement exécuter ceci avec désinfectant activé: http://coliru.stacked-crooked.com/a/d13bb5ff9fb1f7ad – sehe

+0

ok, bonne entrée. Tout ce que je sais, c'est que maintenant le programme semble fonctionner et que les 40 cas de tests qui ont échoué auparavant dans divers endroits passent maintenant tous. Cela dit. Je ne sais pas vraiment comment interpréter la sortie du flag sanitize. Êtes-vous en train de me dire qu'il est dangereux de continuer à utiliser O3 et la fonction boost crc? – tkarls