小编Hen*_*her的帖子

由于 Mersenne Twister 引擎上的负索引,libstdc++ std::random 上的未定义行为(根据 clang -fsanitize=integer)

我在 Ubuntu 20.04 LTS 上使用 clang++ 10,-fsanitize-undefined-trap-on-error -fsanitize=address,undefined,nullability,implicit-integer-truncation,implicit-integer-arithmetic-value-change,implicit-conversion,integer

我的代码正在生成随机字节

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<uint8_t> dd(0, 255);
    ...
    ch = uint8_t(dd(gen));
Run Code Online (Sandbox Code Playgroud)

最后一行导致消毒程序报告未定义的行为位于bits/random.tcc中

template<...> void  mersenne_twister_engine<...>::
    _M_gen_rand(void)   {
      const _UIntType __upper_mask = (~_UIntType()) << __r;
      const _UIntType __lower_mask = ~__upper_mask;

      for (size_t __k = 0; __k < (__n - __m); ++__k)
      {
         _UIntType __y = ((_M_x[__k] & __upper_mask)
               | (_M_x[__k + 1] & __lower_mask));
         _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1)
               ^ ((__y & 0x01) ? __a : 0)); …
Run Code Online (Sandbox Code Playgroud)

c++ g++ clang sanitizer libstdc++

25
推荐指数
3
解决办法
4165
查看次数

标签 统计

c++ ×1

clang ×1

g++ ×1

libstdc++ ×1

sanitizer ×1