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_CheckCharacters_Assertion_CheckContainers_Assertion_CheckInterfaces_Assertion_CheckIO_Assertion_CheckNumerics_Assertion_CheckStrings_Assertion_CheckSystem_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のようにサブプログラム本体に埋め込んでしまうコンパイラですと難しいような。