File: errorhandler-conversions-tostring-stabilityerror.adb

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 (131 lines) | stat: -rw-r--r-- 6,374 bytes parent folder | download | duplicates (3)
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
-------------------------------------------------------------------------------
-- (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.
--
--=============================================================================

separate (ErrorHandler.Conversions.ToString)
procedure StabilityError (Err_Num          : in     Error_Types.NumericError;
                          With_Explanation : in     Boolean;
                          E_Str            : in out E_Strings.T) is
   Stab_Index : ErrorHandler.Index_Type;
   Stab_Typ   : ErrorHandler.Stability_Err_Type;

   procedure StabilityErrorExpl (E_Str : in out E_Strings.T)
   --# global in Stab_Typ;
   --# derives E_Str from *,
   --#                    Stab_Typ;
      is separate;
   -- Note that the parameter names for this subunit are chosen to make it as easy as
   --      possible to auto-generate the subunit from this, its parent, file.  The
   --      generation requires copying the case statement below, stripping out the
   --      current Append'Thing' statements and adding an Append_String for the
   --      explanatory text that is delineated by --! comments.

   procedure Append_Explanation
   --# global in     Stab_Typ;
   --#        in     With_Explanation;
   --#        in out E_Str;
   --# derives E_Str from *,
   --#                    Stab_Typ,
   --#                    With_Explanation;
   is
      Explanation_String : E_Strings.T := E_Strings.Empty_String;
   begin
      if With_Explanation then
         -- we need to at least look for an explanation
         StabilityErrorExpl (E_Str => Explanation_String);
         if E_Strings.Get_Length (E_Str => Explanation_String) > 0 then
            -- there actually is one
            E_Strings.Append_String (E_Str => E_Str,
                                     Str   => ErrorHandler.Explanation_Prefix);
            E_Strings.Append_Examiner_String (E_Str1 => E_Str,
                                              E_Str2 => Explanation_String);
            E_Strings.Append_String (E_Str => E_Str,
                                     Str   => ErrorHandler.Explanation_Postfix);
         end if;
      end if;
   end Append_Explanation;

begin
   Stab_Index := ErrorHandler.Index_Type'Val (Err_Num.Name1.Pos);
   Stab_Typ   := ErrorHandler.Stability_Err_Type'Val (Err_Num.ErrorNum - Error_Types.StabilityErrOffset);

   case Stab_Typ is

      -- HTML Directives
      --! <NameFormat> <"flow-"><Name>
      --! <ErrorFormat> <"!!! Flow Error : "><Name><" : "><Error>

      when ErrorHandler.Stable_Exit_Cond =>
         --! <Name> 40

         E_Strings.Append_String (E_Str => E_Str,
                                  Str   => "Exit condition is stable, of index");

         --! <Error> Exit condition is stable, of index 0
         --! <Error2> Exit condition is stable, of index 1
         --! <Error3> Exit condition is stable, of index greater than 1

         --! In these cases the (loop) exit condition occurs in an iteration scheme,
         --! an exit statement, or an if-statement whose (unique) sequence of
         --! statements ends with an unconditional exit statement - see the SPARK
         --! Definition. The concept of loop stability is explained in Section
         --! 4.4 of Appendix A. A loop exit condition which is stable of index 0
         --! takes the same value at every iteration around the loop, and with a
         --! stability index of 1, it always takes the same value after the first
         --! iteration. Stability with indices greater
         --! than 0 does not necessarily indicate a program error, but the
         --! conditions for loop termination require careful consideration

      when ErrorHandler.Stable_Fork_Cond =>
         --! <Name> 41

         E_Strings.Append_String (E_Str => E_Str,
                                  Str   => "Expression is stable, of index");

         --! <Error> Expression is stable, of index 0
         --! <Error2> Expression is stable, of index 1
         --! <Error3> Expression is stable, of index greater than 1

         --! The expression, occurring within a loop, is either a case expression
         --! or a condition (Boolean-valued expression) associated with an
         --! if-statement, whose value determines the path taken through the body
         --! of the loop, but does not (directly) cause loop termination.
         --! Information flow analysis shows that the expression does not vary
         --! as the loop is executed, so the same branch of the case or if statement will
         --! be taken on every loop iteration. An Index of 0 means that the expression is
         --! immediately stable, 1 means it becomes stable after the first pass through the loop and so on.
         --! The stability index is given with reference to the loop most
         --! closely-containing the expression.  Stable conditionals are not necessarily
         --! an error but do require careful evaluation; they can often be removed by lifting them
         --! outside the loop.
   end case;

   case Stab_Index is
      when ErrorHandler.Index_Zero =>
         E_Strings.Append_String (E_Str => E_Str,
                                  Str   => " 0");
      when ErrorHandler.Index_One =>
         E_Strings.Append_String (E_Str => E_Str,
                                  Str   => " 1");
      when ErrorHandler.Larger_Index =>
         E_Strings.Append_String (E_Str => E_Str,
                                  Str   => " greater than 1");
   end case;

   Append_Explanation;
   E_Strings.Append_String (E_Str => E_Str,
                            Str   => ".");
end StabilityError;