Hi Gabriel,  I follow your suggestion and use ChangeDoChildrenPost and also
not mutate things directly.  I also use method vstmt instead of method
vinstr.   Below is my new version for changing

sprintf(buff,"a string")
to
snprintf(buff,sizeof(buff","a string").

Please let me know if there's any possible side-effects in there.

Another question is that the code I have change the statement of the form
sprintf(buff,"a string") to snprintf(...)  ,  so if I want to change a
different statement of the form  something=sprintf(buff,"a string")  to
something=snprintf,   or foo(sprintf())  to foo(snprintf) ... ,  then I
would need to rewrite another pattern matching , e.g., match ins with Set
instead of Call ?  Is there a more general way to not having to do a pattern
matching  for every case ?

Thanks




let snprintf_va = makeVarinfo true "snprintf" (TVoid [])
let snprintf = Lval((Var snprintf_va),NoOffset)

class snprintfV ?(tracelist=[]) file = object
  inherit nopCilVisitor
  method vstmt s = ChangeDoChildrenPost(
    s,
    fun s -> if L.mem (s.sid) tracelist then (
      match s.skind with
        |Instr il -> let new_il = L.map (
            fun ins -> match ins with
              |Call(None,Lval(Var {vname="sprintf"},_),expl,loc)->
                 let to_buf = L.hd expl in
                 Call(None,snprintf,to_buf::(SizeOfE(to_buf)::L.tl
expl),loc)
              | _ -> ins
          ) il in
          debug "old stmt:\n%s\nnew stmt:\n%s\n" (get_stmt s) (get_stmt
(mkStmt(Instr new_il)));
          {s with skind = Instr new_il}
        | _ -> s
    )else s
  )
end
VN -


2009/12/17 Gabriel Kerneis <kern...@pps.jussieu.fr>

> Hi,
>
> On Thu, Dec 17, 2009 at 03:46:32PM -0700, ThanhVu (Vu) Nguyen wrote:
> >     1)  After I change the original statement s to a new one s'  , I want
> >     s'.id  to be the same as s.id.  Using the   "method vinst",  I
> cannot do
> >     this.
>
> You can, but you have to use the mutable property of the fields rather
> than returning ChangeTo (which will build a new statement, i.e. generate
> a new id). In that case, you seem to be stuck with hacking things in
> vstmt as you originally did (but I might have overlooked some clever way
> to proceed).
>
> I juste realized that the following could work (to be tested):
>
>     method vstmt s = match s.skind with
>     | Instr l ->
>        ChangeDoChildrenPost (s, fun new_s ->
>            new_s.sid <- s.sid; new_s)
>    | _ -> DoChildren
>
> This should restore the sid (no idea if anything bad can happen).
>
>
> >     2) Does it look  correct ?
>
> No.
>
> >   method vinst i = (
> >     match i with
> >       |Call (None,Lval(Var v,os),expl,loc) -> (
> >           v.vname <- v.vname ^ "_NEW" ;
>
> This is an example of mutating things directly, but you have to remember
> that the varinfo is *shared* across your program (i.e. a given single
> varinfo is used everywhere you need to invoke some variable).
> Hence, here, you are adding _NEW not only in some precise spots, but
> everywhere in your program as a side-effect.
>
> You should build a copy of the variable with a different vname, and use
> this one instead:
>            let v' = { v with vname = v.vname ^ "_NEW" } in
>            ChangeTo([ ... v' ... ])
>
> This might break some CIL invariant, though, since the v' variable is
> not declared in the AST.
>
> >           ChangeTo([Call(None,Lval(Var v,os),expl,loc)])
> >         )
> >       |_ -> SkipChildren
> >   )
>
>
> >     What I intend to do eventually is changing statements "sprintf"   to
> >     "snprintf".   Note that I don't want to change _all_ of these sprintf
> >     statements but only specific ones based on their sid's.
>
> The clean solution in your case is to use Cil.findOrCreateFunc to
> initialize some varinfo (with snprintf) and use it directly in vinst:
>
> class sprintfV file =
>    let snprintf_typ =  (* you have to figure it out manually... *) in
>    let snprintf_vi = findOrCreateFunc file "snprintf" snprintf_typ in
>    object
>    ...
>    method vinst i =
>        ...
>        use snprintf_vi here instead of v'
>        ...
>    ...
>    end
>
> Regards,
> --
> Gabriel Kerneis
>
>
> ------------------------------------------------------------------------------
> This SF.Net email is sponsored by the Verizon Developer Community
> Take advantage of Verizon's best-in-class app development support
> A streamlined, 14 day to market process makes app distribution fast and
> easy
> Join now and get one step closer to millions of Verizon customers
> http://p.sf.net/sfu/verizon-dev2dev
> _______________________________________________
> CIL-users mailing list
> CIL-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/cil-users
>
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
CIL-users mailing list
CIL-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cil-users

Reply via email to