4

Ada 言語 (約 10000 行のコードのみ) を使用して大規模なプロジェクトを開発しています。コントラクト ベースのプログラミング (Ada-2012 の事前条件、事後条件、型不変条件などの機能) の使用中に、アサーションまたは条件がうまくいかない場合、プログラムが終了することがわかりました。タイプとエラーの場所に関するメッセージ。

次に、問題が ada 2012 の機能に関するものなのか、それともランタイム エラーに関するものなのかを判断するために、アサーション/コントラクトに関係のない単純なランタイム エラー、つまりゼロによる除算を挿入しようとしました。

declare
    X : Integer := 1 - 1;
    Y : Integer := 1 / X;
begin
    null;
end;

この場合、コンパイラは例外が発生することを通知しますが、実行時にプログラムは完全に終了しますが、何も出力されません。したがって、アサーションに関係するものだけでなく、あらゆる種類の実行時チェックの失敗で問題が発生します。

さらに、数行のコードだけで新しいプロジェクトを作成して、単純なランタイム エラー (ゼロ除算の前と同様) と前提条件とアサーションの失敗を試してみました。この小さなプロジェクトでは、プログラムはすべてのエラーをコンソールに出力します。この問題の影響を受けるのは、大規模なプロジェクトだけです。

私の質問は、どこに問題があるのでしょうか? なぜこれは私のプロジェクトにのみ影響し、作成されたばかりの単純なプロジェクトには影響しないのですか? 実行時チェックの失敗の出力を禁止するオプションはありますか? XUbuntu 13.10で実行しています。gnat、gps、gnatcoll、aws、polyorb の最新 (2013) gpl バージョンを使用しています。スイッチ「-gnata」と「-gnat12」でコンパイルしています。

助けてくれてどうもありがとう。

4

4 に答える 4

3

適切な Ada コンパイラとして GNAT を使用する場合は、最低限、次の引数を渡す必要があります。

  • "-fstack-check", -- スタック チェック コードを生成します (Ada の一部)
  • "-gnata", -- アサーションを有効にする (Ada の一部)
  • "-gnato", -- オーバーフロー チェック (Ada の一部)

個人的には、このプロジェクト ファイルを作成しました。これを使用して、優先引数を GNAT に設定します。

--  O mighty Emacs, please use -*- Ada -*- mode in this lowly file.

abstract project Ada_2012 is
   for Source_Dirs use ();

   package Builder is
      for Default_Switches ("Ada")
        use ("-m");
   end Builder;

   package Compiler is
      for Default_Switches ("Ada")
        use ("-fstack-check", --  Generate stack checking code (part of Ada)
             "-gnata",        --  Enable assertions            (part of Ada)
             "-gnato13",      --  Overflow checking            (part of Ada)
             "-gnatf",                      --  Full, verbose error messages
             "-gnatwa",                     --  All optional warnings
             "-gnatVa",                     --  All validity checks
             "-gnaty3abcdefhiklmnoOprstux", --  Style checks
             "-gnatwe",                     --  Treat warnings as errors
             "-gnat2012",                   --  Use Ada 2012
             "-Wall",                       --  All GCC warnings
             "-O2");                        --  Optimise (level 2/3)
   end Compiler;
end Ada_2012;

標準設定に簡単にアクセスできるように、すべての Ada (2012) プロジェクト ファイルでこのファイルを "使用" します。以下に例を示します ( http://repositories.jacob-sparre.dk/lego-toolsから):

--  O mighty Emacs, please use -*- Ada -*- mode in this lowly file.

with "ada_2012";

project LEGO_Tools is
   for Source_Dirs use ("src/",
                        "../../Mathematics_and_Statistics/**");

   for Main use ("build_mpd_file",
                 "fractal_landscape",
                 "outline_boundaries",
                 "pgm_to_ldraw",
                 "split_ldraw_file");

   package Builder  renames Ada_2012.Builder;
   package Compiler renames Ada_2012.Compiler;

   for Object_Dir use "obj/";
   for Exec_Dir   use "bin/";
end LEGO_Tools;
于 2014-01-29T07:24:12.303 に答える
0

バックトレース情報の取得に関するスイッチがあります。ドキュメントから:

-E ターゲットがサポートしている場合、例外の発生時にトレースバックを保存します。詳細については、パッケージ GNAT.Traceback および GNAT.Traceback.Symbolic も参照してください。x86 ポートでは、-fomit-frame-pointer gcc オプションを使用しないでください。

私はそれが必須だと思います。

于 2014-01-28T22:05:40.223 に答える