Divya,

I'm not giving too much detail, but hopefully this at least gets you
started.

The call instruction is a four-tuple, made up of: the (optional) lvalue
assigned into by the call; the expression representing the function
being called; the list of expressions representing the function
arguments; and the location of the call instruction. I'm assuming here
that you are only interested in explicit calls to malloc and other
functions, versus calls through function pointers. This being the case,
the second argument, the expression representing the function being
called, will be something like:

Lval(Var callee, NoOffset)

Lval is an expression that contains an lval; the lval itself is made of
of an "lhost", here Var representing a variable, and an offset, which
here is NoOffset since this isn't a field in a structure or an element
of an array. callee is a name I chose, and will be of type varinfo
(function names are also stored in varinfo records). You can check to
see if the call is to malloc by checking callee.vname, which holds the
name of the variable (here, the function being called).

Zooming out a bit, you may have a match against the call instruction like:

| Call (lo, Lval (Var callee, NoOffset), al, l)

If this is a call to malloc, al will just contain 1 element,
representing the size_t value passed to malloc. You may be able to take
the existing expression in the list al, say e (you could even change al
in the match to [e] instead, making this match only calls to functions
that take one argument), and change it to something like:

BinOp(PlusA,e,Const(4,IInt,None))

to, for instance, add 4 to whatever expression is already there .

There are a number of existing classes that make use of the visitors
available in CIL -- you will probably want to check out one that uses
vinst, which visits instructions, and base your visitor on that. You
could then visit all the instructions and make a change like this to all
calls to malloc (or other functions you are concerned with).

I hope this helps, and please feel free to contact me with any questions
about the above.

Best regards,

Mark

Divya Krishnan wrote:
> Hi,
> I want to be able to identify certain calls like malloc, realloc etc.
> So I have a visitor that visits all statements and within that the
> instr list and finally identifies Call. However once I identify Call
> statements, how do I identify particular calls like malloc. I tried
> checking to see if CStr in Constant stored some kind of string like
> "malloc". However I see that it does not. So how can I identify malloc
> calls and once identified I would also like modify the call to
> increase the size of the object allocated by the input program.
>
> Thanks,
> -Divya

------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com 
_______________________________________________
CIL-users mailing list
CIL-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cil-users

Reply via email to