[Xcode] Playground で気をつけること arithmetic overflow v.s. EXC_BAD_INSTRUCTION

     
⌛️ < 1 min.
Swift の Playground が 実行環境と異なる挙動をするケースを説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Big Sur 11.3
  • Xcode 12.5

概要

Playground は、小さいコードを試したい時に非常に便利ですが、実行時と異なるエラーを出力するケースがあるので、注意が必要であることに気づきました。

具体的には、実行環境では、”arithmetic overflow” が発生するケースで、Playground では EXC_BAD_INSTRUCTION が発生するようです。

arithmetic overflow

実行時に、オーバーフロー等により発生するエラーです。

例えば、以下のコードで発生します。


let value:UInt64 = (20...35).reduce(1, {$0 * $1})
print(value)

上記コードは、20 から 35 までの数字の積を求めようとしています。

# UInt64 の保持できる最大値が、18,446,744,073,709,551,615 です。

ですが、20 から 32 までの積で 2,163,102,632,570,880,000 となり、そこに 33 を掛けようとすると、UInt64 で保持できる範囲を超えてしまい、オーバーフローが発生します。

このエラーが、”arithmetic overflow” です。

Playground での結果

上記のコードを、Playground で実行すると以下のエラーになります。

Error in Playground
Error in Playground

”error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION” と出ますので、おかしなコードを実行してしまったのかと思いました。

どうして EXC_BAD_INSTRUCTION になるかは、不明です。

オーバーフローする他のケース

以下のようなケースでは、Playground で表示されるエラーは同じですが、詳細のエラー理由がコンソールに表示されます。


let value2 = UInt64(pow(10.0,100.0))

コンソールに表示されるエラー


Swift/x86_64-apple-ios-simulator.swiftinterface:31082: Fatal error: Double value cannot be converted to UInt64 because the result would be greater than UInt64.max

同じ EXC_BAD_INSTRUCTION が発生するのですが、こちらのケースでは詳しい理由が表示されます。

ユーザーとしては、EXC_BAD_INSTRUCTION が発生した時には、単純にコードのエラーだけではなく、別の理由があるかもしれないことに気をつける方が良いようです。

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です