Ada 202x (37日目) - 実行時チェックの抑制¶
本シリーズはAda 2012までの知識と唐突に他言語の雑談が混じっても流せる柳の心を前提としています。 (今更。)
経緯¶
既存のpragmaでは抑制できない実行時チェックが残されていました。
Ada 202xで追加されたチェック名¶
pragma Suppress
/Unsuppress
で指定できるチェック名が追加で定義されました。
Program_Error_Check¶
他のチェックに該当しない Program_Error
を発生させるものが該当します。
Accessibility_Check
等も Program_Error
を発生させますがそれは Program_Error_Check
には含まれません。
「その他」的な扱いのチェック名です。
Tasking_Check¶
Tasking_Error
を発生させる実行時チェックに該当します。
これまで規格の範囲では Tasking_Error
のチェックを省略する方法はありませんでした。
*_Assertion_Check¶
Calendar_Assertion_Check
、 Characters_Assertion_Check
、 Containers_Assertion_Check
、 Interfaces_Assertion_Check
、 IO_Assertion_Check
、 Numerics_Assertion_Check
、 Strings_Assertion_Check
、 System_Assertion_Check
があります。
それぞれ対応する標準ライブラリの Assertion_Error
を発生させる事前条件とpredicateに該当します。
本来 Assertion_Error
を抑制するのはpragma Assertion_Policy
です。
しかしpragma Assertion_Policy
は今コンパイルしているコードに働きかけるもので、コンパイル済みライブラリの中までは影響しません。
generic
をtemplate式で実現しているコンパイラではユーザー側でインスタンス化する際には影響するかもしれません。
コード共有型で実現しているコンパイラでは影響しません。
そこで標準ライブラリに関してはpragma Assertion_Policy
から分離されました。
該当するのは事前条件とpredicateのみです。 事後条件と不変条件に関しては実装が正しければ失敗しない云々。
特に Containers_Assertion_Check
はコンテナのtampering checkも抑制することができます。
27日目も参照。
関連AI¶
AI12-0309-1 Missing checks for pragma Suppress
AI12-0311-1 Suppressing client-side assertions for language-defined units
所感¶
ところで、どうやってコンパイル済みライブラリの挙動を変えるつもりなのでしょうね。
事前条件を常に呼び出し側で評価していたり、またはラッパーで実現していてチェックなし版も外から呼べるようになっているなら簡単でしょうけれども。
GNATのようにサブプログラム本体に埋め込んでしまうコンパイラですと難しいような。