File: vcdetails.ads

package info (click to toggle)
spark 2012.0.deb-9
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 29,260 kB
  • ctags: 3,098
  • sloc: ada: 186,243; cpp: 13,497; makefile: 685; yacc: 440; lex: 176; ansic: 119; sh: 16
file content (268 lines) | stat: -rw-r--r-- 12,479 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
-------------------------------------------------------------------------------
-- (C) Altran Praxis Limited
-------------------------------------------------------------------------------
--
-- The SPARK toolset is free software; you can redistribute it and/or modify it
-- under terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 3, or (at your option) any later
-- version. The SPARK toolset is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-- Public License for more details. You should have received a copy of the GNU
-- General Public License distributed with the SPARK toolset; see file
-- COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy of
-- the license.
--
--=============================================================================

--------------------------------------------------------------------------------
--Synopsis:                                                                   --
--                                                                            --
--Package providing a structure in which to store VC details.                 --
--                                                                            --
--To be used in tandem with the Heap data structure, hence the use of         --
--Heap.Atom as the array range                                                --
--------------------------------------------------------------------------------

with E_Strings;
with HeapIndex;

use type HeapIndex.IndexType;

--# inherit E_Strings,
--#         HeapIndex;

package VCDetails is
   type Terminal_Point_Type is (
                                Assert_Point,
                                Precondition_Check_Point,
                                Check_Statement_Point,
                                Runtime_Check_Point,
                                Refinement_VC_Point,
                                Inheritance_VC_Point,
                                Undetermined_Point);

   --  These errors are the union of all possible errors types from
   --  all possible analysis methods.
   type Error_Type is (--  Missing VC files (NOT zombiescope)
                       Missing_SLG_File, -- SIV file, but no SLG file
                       Missing_VLG_File, -- VCT file, but no VLG file
                       --  Corrupt VC files (NOT zombiescope)
                       Corrupt_VCG_File, -- The VCG file itself has a problem
                       Corrupt_SIV_File, -- The SIV file was corrupted or malformed (simplifier)
                       Corrupt_SLG_File, -- The SLG file was corrupted or malformed (simplifier log)
                       Corrupt_VCT_File, -- The VCT file was corrupted or malformed (victor)
                       Corrupt_VLG_File, -- The VLG file was corrupted or malformed (victor log)
                       Corrupt_RSM_File, -- The RSM file was curripted or malformed (riposte summary)
                       Corrupt_PLG_File, -- The PLG file was corrupted or malformed (checker log)
                       Corrupt_PRV_File, -- The PLG file was corrupted or malformed (manual review)
                       --  Missing DPC files (zombiescope)
                       --  Corrupt DPC files (zombiescope)
                       Corrupt_DPC_File, -- The DPC file itself has a problem
                       Corrupt_SDP_File  -- The SDP file was corrupted or malformed (zombiescope)
                      );
   subtype Error_Type_Missing_VC_Files is Error_Type range Missing_SLG_File .. Missing_VLG_File;
   subtype Error_Type_Corrupt_VC_Files is Error_Type range Corrupt_VCG_File .. Corrupt_PRV_File;
   subtype Error_Type_Corrupt_DPC_Files is Error_Type range Corrupt_DPC_File .. Corrupt_SDP_File;

   -- The possible states of a VC are:
   --   * VC_Not_Present: There is no VC (the user has only generated dpc
   --                     files);
   --   * VC_SIV_Not_Present: The Simplifier has not tried to discharge the VC.
   --   * VC_Undischarged: The VC is undischarged - the Simplifier has failed to
   --                      discharge the VC;
   --   * VC_Proved_By_Examiner: VC was discharged by the Examiner;
   --   * VC_Proved_By_Inference: VC was dischaged by the Simplifier and the
   --                             proof is by inference;
   --   * VC_Proved_By_Contradiction: VC was dischaged by the Simplifier
   --                                 and the proof is by contradiction;
   --   * VC_Proved_By_Checker: VC was discharged using the Checker;
   --   * VC_Proved_By_Review: VC was discharged through a proof review file;
   --   * VC_Proved_By_Using_Proof_Rules: VC was discharged using user proof
   --                                     rules;
   --   * VC_Proved_By_Victor: VC was discharged using Victor;
   --   * VC_Proved_By_Riposte: VC was discharged using Riposte;
   --   * VC_False: VC is false.

   type VC_State_T is (
                       VC_Not_Present,
                       VC_SIV_Not_Present,
                       VC_Undischarged,
                       VC_Proved_By_Examiner,
                       VC_Proved_By_Inference,
                       VC_Proved_By_Contradiction,
                       VC_Proved_Using_User_Proof_Rules,
                       VC_Proved_By_Victor,
                       VC_Proved_By_Riposte,
                       VC_Proved_By_Checker,
                       VC_Proved_By_Review,
                       VC_False);

   -- The possible states of a DPC are:
   --   * DPC_Not_Present: There is no DPC (the user has only generated
   --                      VCG files).
   --   * DPC_SIV_Not_Present: No SDP is present for DPC.
   --   * DPC_Unchecked: The Examiner generated at DPC that does not required
   --                    ZombieScope to check for dead paths - e.g. RTCs
   --                    and asserts.
   --   * DPC_Live: Path is not a dead path.
   --   * DPC_Dead: Path is a dead path.

   type DPC_State_T is (DPC_Not_Present, DPC_SDP_Not_Present, DPC_Unchecked, DPC_Live, DPC_Dead);

   End_Type_Image_Length : constant := 12;
   subtype End_Type_Image_Index is Positive range 1 .. End_Type_Image_Length;
   subtype End_Type_Image_String is String (End_Type_Image_Index);
   type End_Type_To_Image_Array is array (Terminal_Point_Type) of End_Type_Image_String;

   End_Type_Image : constant End_Type_To_Image_Array :=
     End_Type_To_Image_Array'
     (Assert_Point             => "   assert @ ",
      Precondition_Check_Point => "pre check @ ",
      Check_Statement_Point    => "check stm @ ",
      Runtime_Check_Point      => "rtc check @ ",
      Refinement_VC_Point      => "refinement  ",
      Inheritance_VC_Point     => "inheritance ",
      Undetermined_Point       => "            ");

   type Data_Type is private;

   procedure Add
     (Details    : in out Data_Type;
      Index      :    out HeapIndex.IndexType;
      Success    :    out Boolean;
      Name       : in     E_Strings.T;
      Path_Start : in     E_Strings.T;
      Path_End   : in     E_Strings.T;
      End_Type   : in     Terminal_Point_Type;
      VC_State   : in     VC_State_T;
      DPC_State  : in     DPC_State_T);
   --# derives Details from *,
   --#                      DPC_State,
   --#                      End_Type,
   --#                      Name,
   --#                      Path_End,
   --#                      Path_Start,
   --#                      VC_State &
   --#         Index,
   --#         Success from Details;

   procedure Initialize (Details : out Data_Type);
   --# derives Details from ;

   procedure Raise_Error (Error_Kind : in     Error_Type;
                          Details    : in out Data_Type);
   --# derives Details from *,
   --#                      Error_Kind;

   function Error_Raised (Error_Kind : in Error_Type;
                          Details    : in Data_Type) return Boolean;

   procedure Set_VC_State (Details  : in out Data_Type;
                           Index    : in     HeapIndex.IndexType;
                           VC_State : in     VC_State_T);
   --# derives Details from *,
   --#                      Index,
   --#                      VC_State;

   function Get_VC_State (Details : in Data_Type;
                          Index   : in HeapIndex.IndexType) return VC_State_T;

   procedure Set_DPC_State (Details   : in out Data_Type;
                            Index     : in     HeapIndex.IndexType;
                            DPC_State : in     DPC_State_T);
   --# derives Details from *,
   --#                      DPC_State,
   --#                      Index;

   function Get_DPC_State (Details : in Data_Type;
                           Index   : in HeapIndex.IndexType) return DPC_State_T;

   --------------------------------------------------------------------------
   -- this compares the information given and returns
   -- Result is as defined in section 5.4 of the specification
   -- it works directly on values rather than on indices into the Details
   -- structure so that information can be compared before insertion
   -- NOTE : the procedure is successful iff neither Type is Invalid
   --------------------------------------------------------------------------
   procedure Order (First_Name  : in     E_Strings.T;
                    Second_Name : in     E_Strings.T;
                    Result      :    out E_Strings.Order_Types);
   --# derives Result from First_Name,
   --#                     Second_Name;

   procedure Retrieve
     (Details    : in     Data_Type;
      Index      : in     HeapIndex.IndexType;
      Success    :    out Boolean;
      Name       :    out E_Strings.T;
      Path_Start :    out E_Strings.T;
      Path_End   :    out E_Strings.T;
      End_Type   :    out Terminal_Point_Type;
      VC_State   :    out VC_State_T;
      DPC_State  :    out DPC_State_T);
   --# derives DPC_State,
   --#         End_Type,
   --#         Name,
   --#         Path_End,
   --#         Path_Start,
   --#         Success,
   --#         VC_State   from Details,
   --#                         Index;

   --------------------------------------------------------------------------
   -- Path_End_To_Path_Type
   --
   -- Parses a Path End string to convert it into a Terminal Point Type
   -- The basic patterns scanned for are:
   --   ... to check ...              -> check statement point
   --   ... to run-time check ...     -> run-time check point
   --   ... to precondition check ... -> precondition check point
   --   ... to assertion ...          -> assertion point
   --   ... refinement ...            -> refinement VC point
   --   ... inheritance  ...          -> inheritance VC point
   --   ... anything else ...         -> undetermined point
   --------------------------------------------------------------------------
   function Path_End_To_Path_Type (Line : E_Strings.T) return Terminal_Point_Type;

   function End_Point_Type (Details : in Data_Type;
                            Index   : in HeapIndex.IndexType) return Terminal_Point_Type;

private

   type Details_Element is record
      Name       : E_Strings.T;
      Path_Start : E_Strings.T;
      Path_End   : E_Strings.T;
      End_Type   : Terminal_Point_Type;
      VC_State   : VC_State_T;
      DPC_State  : DPC_State_T;
   end record;

   Null_Details_Element : constant Details_Element :=
     Details_Element'
     (Name       => E_Strings.Empty_String,
      Path_Start => E_Strings.Empty_String,
      Path_End   => E_Strings.Empty_String,
      End_Type   => Undetermined_Point,
      VC_State   => VC_Not_Present,
      DPC_State  => DPC_Not_Present);

   type Elements_Array is array (HeapIndex.IndexType) of Details_Element;

   -- Use an array to store the different error kinds that may be associated
   -- with a subprogram. This construct may be extended by adding a new enumerated
   -- type, without having to extend the subprogram interfaces.
   type Error_Array is array (Error_Type) of Boolean;

   -- High_Mark is the number of the highest allocated atom - zero if the
   -- structure is empty
   -- Error_Status records different kinds of errors that may be encountered
   -- during analysis.
   type Data_Type is record
      Details      : Elements_Array;
      High_Mark    : HeapIndex.IndexType;
      Error_Status : Error_Array;
   end record;

end VCDetails;