【问题标题】:boost crc optimized fails on armboost crc优化在手臂上失败
【发布时间】:2018-01-18 12:14:42
【问题描述】:

我有一个为 x86 和 arm (rpi2) 编译的程序。我正在使用 boost 进行 crc 实现,但在 arm 平台上失败时遇到了问题。

调试后,我发现 crc 计算在 arm 上关闭。我写了这些小测试用例来查明问题:

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。但是在 arm 上只有 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

我很惊讶在 boost 中遇到这样的事情。关于造成这种情况的任何想法?

【问题讨论】:

    标签: c++ gcc boost arm


    【解决方案1】:

    好吧,事实证明问题只存在于 -O3 中。不适用于 -O2 或更低。

    此外,将 gcc 升级到 7.1.1 20170516 也解决了这个问题。即使使用 -O3

    【讨论】:

    • “解决了问题”还是“消除了症状”?它仍然可能是未定义的行为。
    • 如果有人想在启用消毒剂的情况下轻松运行它:coliru.stacked-crooked.com/a/d13bb5ff9fb1f7ad
    • 好的,很好的输入。我所知道的是,现在该程序似乎可以运行,并且之前在各个地方失败的约 40 个测试用例现在都通过了。那就是说。我真的不知道如何解释 sanitize 标志的输出。你是说继续使用 O3 和 boost crc 功能不安全吗?
    • 我不希望有 UB。但是代码实际上在做一些令人讨厌的事情的可能性很小。我会尝试检查(在 Linux 或 Windows 上获取 ARM 工具链的任何提示?)
    • 好的,谢谢!我正在使用arch linux,但我没有设置完整的交叉编译器。我们所做的是让构建服务器在真正的 rpi2 上运行代理,然后我们在虚拟 x86 机器上运行多个 distcc 从属服务器,根据archlinuxarm.org/wiki/Distcc_Cross-Compiling 为 arm 进行交叉编译,这样效果很好。有些文件无法在从属服务器上构建,然后在本机架构上重新编译。在任何情况下。我们使用的是链接页面上用于 armv7h 的 ng-toolchain。
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多