2017-10-12 17 views
4

あなたはこのコードを実行すると:大きすぎるビットシフトはRustの未定義の動作であると予想されますか?

#![allow(exceeding_bitshifts)] 

fn main() { 
    const NUMBER: u64 = 0b_10101010; 

    fn print_shift(i: u32) { 
     println!("{:b}", NUMBER >> i); 
    } 

    print_shift(65); 
    println!("{:b}", NUMBER >> 65); 
} 

をあなたがコンパイル時や実行時に実行するときにビット長を超えた値と数のビットをシフトすると、異なる動作を生成することを参照してください。

これは正常な動作ですか?それはどこかに文書化されていますか?これはlist of documented undefined behaviorにはありません。

答えて

6

いいえ、これはではなく、ですが、は未定義の動作です。 This is "just" a bug

ここでであり、コンパイル時に定数がどのように計算されるか、そして実行時に値がどのように計算されるかに違いはありません。コンパイルを実行しているマシンとコードを実行しているマシンがまったく異なるアーキテクチャを持っている可能性があるため、これは一般的に難しい問題です。


リリースビルド対デバッグの話、「大きすぎる」bitshiftsの動作が期待され、また ない未定義の動作です。プログラマがかもしれませんが錆コンパイラは、以下の行動は危険な を考慮していない

:右オーバーフロー

Integer overflow is neither unsafe nor undefinedにシフトする

の試み:手掛かりは、エラーメッセージにあります予期せぬ望ましくないもの、または が間違っていると見なしてください。

  • ...
  • 整数オーバーフロー

見る:

+0

同じパラメータで同じ機能( 'x.shr(Y ) ')は、異なる呼び出しで異なる答えを与えます。これはUBじゃない? – Boiethios

+1

@Boiethios私は、*定義されていない動作*という用語を正しく使用しているかどうかはわかりません。 'random()'(通常は)は異なる呼び出しで異なる答えを返しますが、その動作が定義されていないことを意味するものではありません。 – Shepmaster

関連する問題