aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYannick Moy <moy@adacore.com>2019-07-09 07:53:21 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-09 07:53:21 +0000
commite0201d823abfcbc3acadc1f78a0c94fdc8474dfe (patch)
tree38dc220a202f0a0adb0bb44427b607f6553b31f2 /gcc
parentb5d3d113ca9c67320ed06b65c50e8e46e22b6198 (diff)
downloadgcc-e0201d823abfcbc3acadc1f78a0c94fdc8474dfe.zip
gcc-e0201d823abfcbc3acadc1f78a0c94fdc8474dfe.tar.gz
gcc-e0201d823abfcbc3acadc1f78a0c94fdc8474dfe.tar.bz2
[Ada] Fix ownership checking for pointers in SPARK
Checking of the readable status of sub-expressions occurring in the target path of an assignment should occur before the right-hand-side is moved or borrowed or observed. There is no impact on compilation. 2019-07-09 Yannick Moy <moy@adacore.com> gcc/ada/ * sem_spark.adb (Check_Expression): Change signature to take an Extended_Checking_Mode, for handling read permission checking of sub-expressions in an assignment. (Check_Parameter_Or_Global): Adapt to new behavior of Check_Expression for mode Assign. (Check_Safe_Pointers): Do not analyze generic bodies. (Check_Assignment): Separate checking of the target of an assignment. From-SVN: r273266
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog11
-rw-r--r--gcc/ada/sem_spark.adb74
2 files changed, 62 insertions, 23 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 02dc4ad..9f6b789 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,14 @@
+2019-07-09 Yannick Moy <moy@adacore.com>
+
+ * sem_spark.adb (Check_Expression): Change signature to take an
+ Extended_Checking_Mode, for handling read permission checking of
+ sub-expressions in an assignment.
+ (Check_Parameter_Or_Global): Adapt to new behavior of
+ Check_Expression for mode Assign.
+ (Check_Safe_Pointers): Do not analyze generic bodies.
+ (Check_Assignment): Separate checking of the target of an
+ assignment.
+
2019-07-09 Eric Botcazou <ebotcazou@adacore.com>
* repinfo.ads (JSON format): Adjust.
diff --git a/gcc/ada/sem_spark.adb b/gcc/ada/sem_spark.adb
index fb46e62..2b19919 100644
--- a/gcc/ada/sem_spark.adb
+++ b/gcc/ada/sem_spark.adb
@@ -560,9 +560,13 @@ package body Sem_SPARK is
-- has the right permission, and also updating permissions when a path is
-- moved, borrowed, or observed.
- type Checking_Mode is
+ type Extended_Checking_Mode is
- (Read,
+ (Read_Subexpr,
+ -- Special value used for assignment, to check that subexpressions of
+ -- the assigned path are readable.
+
+ Read,
-- Default mode
Move,
@@ -591,6 +595,8 @@ package body Sem_SPARK is
-- and extensions are set to Read_Only.
);
+ subtype Checking_Mode is Extended_Checking_Mode range Read .. Observe;
+
type Result_Kind is (Folded, Unfolded);
-- The type declaration to discriminate in the Perm_Or_Tree type
@@ -631,7 +637,7 @@ package body Sem_SPARK is
procedure Check_Declaration (Decl : Node_Id);
- procedure Check_Expression (Expr : Node_Id; Mode : Checking_Mode);
+ procedure Check_Expression (Expr : Node_Id; Mode : Extended_Checking_Mode);
pragma Precondition (Nkind_In (Expr, N_Index_Or_Discriminant_Constraint,
N_Range_Constraint,
N_Subtype_Indication)
@@ -1421,8 +1427,10 @@ package body Sem_SPARK is
-- Check_Expression --
----------------------
- procedure Check_Expression (Expr : Node_Id; Mode : Checking_Mode) is
-
+ procedure Check_Expression
+ (Expr : Node_Id;
+ Mode : Extended_Checking_Mode)
+ is
-- Local subprograms
function Is_Type_Name (Expr : Node_Id) return Boolean;
@@ -1543,8 +1551,14 @@ package body Sem_SPARK is
return;
elsif Is_Path_Expression (Expr) then
- Read_Indexes (Expr);
- Process_Path (Expr, Mode);
+ if Mode /= Assign then
+ Read_Indexes (Expr);
+ end if;
+
+ if Mode /= Read_Subexpr then
+ Process_Path (Expr, Mode);
+ end if;
+
return;
end if;
@@ -2511,6 +2525,10 @@ package body Sem_SPARK is
Mode := Move;
end case;
+ if Mode = Assign then
+ Check_Expression (Expr, Read_Subexpr);
+ end if;
+
Check_Expression (Expr, Mode);
end Check_Parameter_Or_Global;
@@ -2618,11 +2636,6 @@ package body Sem_SPARK is
Reset (Current_Perm_Env);
end Initialize;
- -- Local variables
-
- Prag : Node_Id;
- -- SPARK_Mode pragma in application
-
-- Start of processing for Check_Safe_Pointers
begin
@@ -2636,20 +2649,28 @@ package body Sem_SPARK is
| N_Package_Declaration
| N_Subprogram_Body
=>
- Prag := SPARK_Pragma (Defining_Entity (N));
+ declare
+ E : constant Entity_Id := Defining_Entity (N);
+ Prag : constant Node_Id := SPARK_Pragma (E);
+ -- SPARK_Mode pragma in application
- if Present (Prag) then
- if Get_SPARK_Mode_From_Annotation (Prag) = Opt.On then
- Check_Node (N);
- end if;
+ begin
+ if Ekind (Unique_Entity (E)) in Generic_Unit_Kind then
+ null;
- elsif Nkind (N) = N_Package_Body then
- Check_List (Declarations (N));
+ elsif Present (Prag) then
+ if Get_SPARK_Mode_From_Annotation (Prag) = Opt.On then
+ Check_Node (N);
+ end if;
- elsif Nkind (N) = N_Package_Declaration then
- Check_List (Private_Declarations (Specification (N)));
- Check_List (Visible_Declarations (Specification (N)));
- end if;
+ elsif Nkind (N) = N_Package_Body then
+ Check_List (Declarations (N));
+
+ elsif Nkind (N) = N_Package_Declaration then
+ Check_List (Private_Declarations (Specification (N)));
+ Check_List (Visible_Declarations (Specification (N)));
+ end if;
+ end;
when others =>
null;
@@ -2717,7 +2738,14 @@ package body Sem_SPARK is
when N_Assignment_Statement =>
declare
Target : constant Node_Id := Name (Stmt);
+
begin
+ -- Start with checking that the subexpressions of the target
+ -- path are readable, before possibly updating the permission
+ -- of these subexpressions in Check_Assignment.
+
+ Check_Expression (Target, Read_Subexpr);
+
Check_Assignment (Target => Target,
Expr => Expression (Stmt));