Sponsor Link
環境&対象
- 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: 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 が発生した時には、単純にコードのエラーだけではなく、別の理由があるかもしれないことに気をつける方が良いようです。
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
Sponsor Link