Ada 202x (37日目) - 実行時チェックの抑制 ======================================== .. post:: Jan 06, 2020 :tags: ada, ada_2022 .. role:: gray-and-small 本シリーズはAda 2012までの知識\ :gray-and-small:`と唐突に他言語の雑談が混じっても流せる柳の心`\ を前提としています。 (今更。) 経緯 ---- 既存の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も抑制することができます。 :doc:`27日目 `\ も参照。 関連AI ------ - `AI12-0309-1`_ **Missing checks for pragma Suppress** - `AI12-0311-1`_ **Suppressing client-side assertions for language-defined units** 所感 ---- ところで、どうやってコンパイル済みライブラリの挙動を変えるつもりなのでしょうね。 事前条件を常に呼び出し側で評価していたり、またはラッパーで実現していてチェックなし版も外から呼べるようになっているなら簡単でしょうけれども。 GNATのようにサブプログラム本体に埋め込んでしまうコンパイラですと難しいような。 .. _`AI12-0309-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0309-1.txt .. _`AI12-0311-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0311-1.txt