Parcourir la source

Added range check vor integer constants

Taddeus Kroes il y a 12 ans
Parent
commit
5355a47d07
1 fichiers modifiés avec 16 ajouts et 8 suppressions
  1. 16 8
      phases/typecheck.ml

+ 16 - 8
phases/typecheck.ml

@@ -1,8 +1,3 @@
-open Printf
-open Types
-open Util
-open Stringify
-
 (*
  * Do a number of checks:
  * - A void function must not return a value.
@@ -19,6 +14,13 @@ open Stringify
  *   a boolean.
  * - Only values having a basic type can be type cast.
  *)
+open Printf
+open Types
+open Util
+open Stringify
+
+let min_int = int_of_float (-.(2. ** 31.))
+let max_int = int_of_float (2. ** 31.) - 1
 
 let array_depth = function
     | ArrayDims (_, dims) -> List.length dims
@@ -181,9 +183,15 @@ let rec typecheck node =
         DoWhile (check_trav Bool cond, typecheck body, ann)
 
     (* Constants *)
-    | Const (BoolVal  value, ann) -> Const (BoolVal  value, Type Bool  :: ann)
-    | Const (IntVal   value, ann) -> Const (IntVal   value, Type Int   :: ann)
-    | Const (FloatVal value, ann) -> Const (FloatVal value, Type Float :: ann)
+    | Const (BoolVal value, ann) ->
+        Const (BoolVal value, Type Bool :: ann)
+    | Const (IntVal value, ann) ->
+        if value < min_int || value > max_int then (
+            raise (NodeError (node, "integer value out of range"))
+        );
+        Const (IntVal value, Type Int :: ann)
+    | Const (FloatVal value, ann) ->
+        Const (FloatVal value, Type Float :: ann)
 
     (* Variables inherit the type of their declaration *)
     | VarUse (dec, None, ann) ->