>
> 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.
>
> 2) And the return type of "method vinst" is "Cil.instr list
> Cil.visitAction" so I cannot call ChangeTo(new_stmt) .
>
I made some changes by returning ChangeTo([Call(None,Lval(Var
v,os),expl,loc)]) and it fixes these problems. Does it look correct
?
method vinst i = (
match i with
|Call (None,Lval(Var v,os),expl,loc) -> (
v.vname <- v.vname ^ "_NEW" ;
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.
>
> For example I'd like to change a statement looking like
>
> sprintf(fixed_buf,"a string\n"); where fixed_buff is an array holding
> char (e.g., char fixed_buff[100])
>
> to
>
> snprintf(fixed_buf,sizeof(fixed_buf),"a string\n");
>
>
> ---------------
>
>
>
>
> class sprintfV ? file = object
> inherit nopCilVisitor
>
> method vstmt s = (
> match s.skind with
> |If (_, _, _, _) |Switch (_, _, _, _) |Block _ -> DoChildren
> |Instr il when s.sid == WHAT_I_WANT -> DoChildren
> |_ -> SkipChildren
>
> )
>
> method vinst i = (
> match i with
> |Call (None,Lval(Var v,os),expl,loc) -> (
> v.vname <- v.vname ^ "_NEW" ;
> let new_stmt = mkStmtOneInstr (Call(None,Lval(Var
> v,os),expl,loc)) in
> (*new_stmt.sid <- s.sid; (* ERROR: I cannot change the sid
> because s is no longer known*)
> ChangeTo(new_stmt) (*ERROR: it expects Cil.instr list
> Cil.visitAction*)
> )
> |_ -> SkipChildren
> )
> end
>
>
>
>
>
> VN -
>
>
>
> On Thu, Dec 17, 2009 at 1:58 AM, Gabriel Kerneis
> <[email protected]>wrote:
>
>> Hi,
>>
>> Your code might work on simple examples, but it will probably break on
>> real programms. Could you give a real example of what you are trying to
>> do? Don't you want to change the name of the function in it's
>> definition too? What if there are function pointers? All this can be
>> changed very easily, but you have to define precisely what you want.
>>
>> If you wished to rename the function everywhere (definition, use, etc.),
>> then the following very simple code would be enough:
>>
>> class testVisitor = object
>> inherit nopCilVisitor
>>
>> method vvdec vi =
>> if List.mem vi.vname ["foo"; "bar"]
>> then vi.vname <- vi.vname ^ "_new"
>> (* No ChangeTo, imperative mutation *);
>> SkipChildren
>>
>> end
>>
>> Back to your code.
>>
>> You should use the various methods of the cil visitor to make things
>> easier to read. Moreover, this would have let you spot the fact that you
>> do NOT dive into Block, If, and other statements. Therefore, you only
>> perform variable substitution in top-level instructions. You cut the
>> Instr statement to keep only the first element: what if the function you
>> are interested in is later in the call sequence? Check out List.map in
>> the OCaml doc, it might help you a lot. Using ChangeTo with statements
>> can be tricky, too: this potentially breaks gotos (read the CIL API
>> documentation, this is mentionned). One last thing: use richer patterns
>> in your match cases (see vinst below).
>>
>> class testVisitor = object
>> inherit nopCilVisitor
>>
>> method vinst i = match i with
>> | Call(None, Lval (Var lv, NoOffset), es,loc) ->
>> (* Do what you want here --- I do not understand exactly what you
>> want *)
>> let lv' = (* ... *) in
>> ChangeTo (Call(None, Lval (Var lv', NoOffset), es,loc))
>> | Call(None, _, _, _) ->
>> debug "don't know";
>> SkipChildren
>> | _ -> SkipChildren
>>
>> method vstmt s = match s.skind with
>> | Instr [] -> SkipChildren (* this is useless, but I put it there to
>> show you a convenient way to remove
>> if/else in your code *)
>> | Instr l ->
>> debug "gh\n";
>> if s.sid = WHAT_I_WANT (* I'm not sure how you can figure out
>> which sid you want, but anyway... *)
>> then DoChildren
>> else SkipChildren
>> | _ -> DoChildren
>>
>> end
>>
>> Regards,
>> --
>> Gabriel
>>
>
>
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/cil-users