@@ -17,7 +17,11 @@ module F = Format
1717type t =
1818 | ArrayExp of lval * exp * location
1919 | DerefExp of exp * location
20- | MulExp of exp * location
20+ | PlusIOExp of exp * location
21+ | MinusIOExp of exp * location
22+ | MultIOExp of exp * location
23+ | ShiftIOExp of exp * location
24+ | CastIOExp of exp * location
2125 | DivExp of exp * location
2226 | Strcpy of exp * exp * location
2327 | Strcat of exp * exp * location
@@ -32,7 +36,13 @@ let to_string t =
3236 match t with
3337 | ArrayExp (lv , e , _ ) -> CilHelper. s_lv lv ^ " [" ^ CilHelper. s_exp e ^ " ]"
3438 | DerefExp (e , _ ) -> " *(" ^ CilHelper. s_exp e ^ " )"
35- | MulExp (e , _ ) | DivExp (e , _ ) -> CilHelper. s_exp e
39+ | DivExp (e, _)
40+ | PlusIOExp (e, _)
41+ | MinusIOExp (e, _)
42+ | MultIOExp (e, _)
43+ | ShiftIOExp (e, _)
44+ | CastIOExp (e , _ ) ->
45+ CilHelper. s_exp e
3646 | Strcpy (e1 , e2 , _ ) ->
3747 " strcpy (" ^ CilHelper. s_exp e1 ^ " , " ^ CilHelper. s_exp e2 ^ " )"
3848 | Strncpy (e1 , e2 , e3 , _ ) ->
@@ -54,7 +64,11 @@ let to_string t =
5464let location_of = function
5565 | ArrayExp (_, _, l)
5666 | DerefExp (_, l)
57- | MulExp (_, l)
67+ | PlusIOExp (_, l)
68+ | MinusIOExp (_, l)
69+ | MultIOExp (_, l)
70+ | ShiftIOExp (_, l)
71+ | CastIOExp (_, l)
5872 | DivExp (_, l)
5973 | Strcpy (_, _, l)
6074 | Strncpy (_, _, _, l)
@@ -100,11 +114,18 @@ and c_exp e loc =
100114 | UnOp (_ , e , _ ) -> c_exp e loc
101115 | BinOp (bop , e1 , e2 , _ ) -> (
102116 match bop with
103- | Mult when ! Options. mul ->
104- (MulExp (e, loc) :: c_exp e1 loc) @ c_exp e2 loc
117+ | PlusA when ! Options. plus_io ->
118+ (PlusIOExp (e, loc) :: c_exp e1 loc) @ c_exp e2 loc
119+ | MinusA when ! Options. minus_io ->
120+ (MinusIOExp (e, loc) :: c_exp e1 loc) @ c_exp e2 loc
121+ | Mult when ! Options. mult_io ->
122+ (MultIOExp (e, loc) :: c_exp e1 loc) @ c_exp e2 loc
123+ | (Shiftlt | Shiftrt ) when ! Options. shift_io ->
124+ (ShiftIOExp (e, loc) :: c_exp e1 loc) @ c_exp e2 loc
105125 | Div | Mod -> (DivExp (e, loc) :: c_exp e1 loc) @ c_exp e2 loc
106126 | _ -> c_exp e1 loc @ c_exp e2 loc)
107- | CastE (_ , e ) -> c_exp e loc
127+ | CastE (_ , e' ) when ! Options. cast_io -> CastIOExp (e, loc) :: c_exp e' loc
128+ | CastE (_ , e' ) -> c_exp e' loc
108129 | AddrOf lv -> c_lv lv loc
109130 | StartOf lv -> c_lv lv loc
110131 | _ -> []
@@ -121,6 +142,7 @@ let query_lib =
121142 " memchr" ;
122143 " strncmp" ;
123144 " sprintf" ;
145+ " fread" ;
124146 ]
125147
126148let c_lib f es loc =
@@ -139,6 +161,10 @@ let c_lib f es loc =
139161 BufferOverrunLib
140162 (f.vname, [ List. nth es 0 ; List. nth es 1 ; List. nth es 2 ], loc)
141163 :: c_exps es loc
164+ | "fread" ->
165+ BufferOverrunLib
166+ (f.vname, [ List. nth es 0 ; List. nth es 1 ; List. nth es 2 ], loc)
167+ :: c_exps es loc
142168 | _ -> []
143169
144170let c_lib_taint f es loc =
@@ -148,6 +174,11 @@ let c_lib_taint f es loc =
148174 | " calloc" | " g_malloc" | " g_malloc_n" | " g_malloc0" | " g_try_malloc"
149175 | "g_try_malloc_n" | "__builtin_alloca" ->
150176 [ AllocSize (f.vname, List. nth es 0 , loc) ]
177+ | "fread" ->
178+ [
179+ BufferOverrunLib
180+ (f.vname, [ List. nth es 0 ; List. nth es 1 ; List. nth es 2 ], loc);
181+ ]
151182 | "printf" -> [ Printf (f.vname, List. nth es 0 , loc) ]
152183 | " fprintf" | " sprintf" | " vfprintf" | " vsprintf" | " vasprintf" | " __asprintf"
153184 | "asprintf" | "vdprintf" | "dprintf" | "easprintf" | "evasprintf" ->
0 commit comments