@@ -815,6 +815,8 @@ struct
815815 match ofs with
816816 | NoOffset -> `NoOffset
817817 | Field (fld , ofs ) -> `Field (fld, convert_offset a gs st ofs)
818+ | Index (CastE (TInt(IInt,[] ), Const (CStr ("unknown" ,No_encoding))), ofs ) -> (* special offset added by convertToQueryLval *)
819+ `Index (IdxDom. top () , convert_offset a gs st ofs)
818820 | Index (exp , ofs ) ->
819821 let exp_rv = eval_rv a gs st exp in
820822 match exp_rv with
@@ -2120,6 +2122,40 @@ struct
21202122 let st: store = ctx.local in
21212123 let gs = ctx.global in
21222124 match LF. classify f.vname args with
2125+ | `Unknown (("memset" | "__builtin_memset" | "__builtin___memset_chk" ) as name ) ->
2126+ begin match name, args with
2127+ | " __builtin___memset_chk" , [dest; ch; count; _ (* dest_size *) ]
2128+ | ("memset" | "__builtin_memset" ), [dest; ch; count] ->
2129+ (* TODO: check count *)
2130+ let eval_ch = eval_rv (Analyses. ask_of_ctx ctx) gs st ch in
2131+ let dest_lval = mkMem ~addr: (Cil. stripCasts dest) ~off: NoOffset in
2132+ let dest_a = eval_lv (Analyses. ask_of_ctx ctx) gs st dest_lval in
2133+ (* let dest_typ = Cilfacade.typeOfLval dest_lval in *)
2134+ let dest_typ = AD. get_type dest_a in (* TODO: what is the right way? *)
2135+ let value =
2136+ match eval_ch with
2137+ | `Int i when ID. to_int i = Some Z. zero ->
2138+ VD. zero_init_value dest_typ
2139+ | _ ->
2140+ VD. top_value dest_typ
2141+ in
2142+ set ~ctx: (Some ctx) (Analyses. ask_of_ctx ctx) gs st dest_a dest_typ value
2143+ | _ , _ -> failwith " strange memset arguments"
2144+ end
2145+ | `Unknown (("bzero" | "__builtin_bzero" | "explicit_bzero" | "__explicit_bzero_chk" ) as name ) ->
2146+ (* TODO: share something with memset special case? *)
2147+ begin match name, args with
2148+ | " __explicit_bzero_chk" , [dest; count; _ (* dest_size *) ]
2149+ | ("bzero" | "__builtin_bzero" | "explicit_bzero" ), [dest; count] ->
2150+ (* TODO: check count *)
2151+ let dest_lval = mkMem ~addr: (Cil. stripCasts dest) ~off: NoOffset in
2152+ let dest_a = eval_lv (Analyses. ask_of_ctx ctx) gs st dest_lval in
2153+ (* let dest_typ = Cilfacade.typeOfLval dest_lval in *)
2154+ let dest_typ = AD. get_type dest_a in (* TODO: what is the right way? *)
2155+ let value = VD. zero_init_value dest_typ in
2156+ set ~ctx: (Some ctx) (Analyses. ask_of_ctx ctx) gs st dest_a dest_typ value
2157+ | _ , _ -> failwith " strange bzero arguments"
2158+ end
21232159 | `Unknown " F59" (* strcpy *)
21242160 | `Unknown " F60" (* strncpy *)
21252161 | `Unknown " F63" (* memcpy *)
0 commit comments