daily report on extending static analyzer project [GSoC]
David Malcolm
dmalcolm@redhat.com
Sun Jun 27 18:48:44 GMT 2021
On Sat, 2021-06-26 at 20:50 +0530, Ankur Saini wrote:
>
> > On 25-Jun-2021, at 9:04 PM, David Malcolm <dmalcolm@redhat.com>
> > wrote:
> >
> > On Fri, 2021-06-25 at 20:33 +0530, Ankur Saini wrote:
> > > AIM for today :
> > >
> > > - try to create an intra-procedural link between the calls the
> > > calling
> > > and returning snodes
> > > - figure out the program point where exploded graph would know
> > > about
> > > the function calls
> > > - figure out how the exploded node will know which function to
> > > call
> > > - create enodes and eedges for the calls
> > >
> > > —
> > >
> > > PROGRESS :
> > >
> > > - I created an intraprocedural link between where the the
> > > splitting is happening to connect the call and returning snodes.
> > > like this :-
> > >
> > > (in supergraph.cc at "supergraph::supergraph (logger *logger)" )
> > > ```
> > > 185 if (cgraph_edge *edge = supergraph_call_edge
> > > (fun, stmt))
> > > 186 {
> > > 187 m_cgraph_edge_to_caller_prev_node.put(edge,
> > > node_for_stmts);
> > > 188 node_for_stmts = add_node (fun, bb, as_a
> > > <gcall *> (stmt), NULL);
> > > 189 m_cgraph_edge_to_caller_next_node.put (edge,
> > > node_for_stmts);
> > > 190 }
> > > 191 else
> > > 192 {
> > > 193 gcall *call = dyn_cast<gcall *> (stmt);
> > > 194 if (call)
> > > 195 {
> > > 196 supernode *old_node_for_stmts =
> > > node_for_stmts;
> > > 197 node_for_stmts = add_node (fun, bb, as_a
> > > <gcall *> (stmt), NULL);
> >
> > ^^^^^^^^^^^^^^^^^^^^^
> > Given the dyn_cast of stmt to gcall * at line 193 you can use
> > "call"
> > here, without the as_a cast, as you've already got "stmt" as a
> > gcall *
> > as tline 193.
>
> ok
>
> >
> > You might need to add a hash_map recording the mapping from such
> > stmts
> > to the edges, like line 189 does. I'm not sure, but you may need
> > it
> > later.
>
> but the node is being created if there is no cgraph_edge
> corresponding to the call, so to what edge will I map
> “node_for_stmts" to ?
Sorry; I think I got confused. Re-reading this part of my email, it
doesn't make sense to me. Sorry.
[...snip...]
>
>
> >
> > >
> > > Q. But even if we find out which function to call, how will the
> > > analyzer know which snode does that function belong ?
> >
> > Use this method of supergraph:
> > supernode *get_node_for_function_entry (function *fun) const;
> > to get the supernode for the entrypoint of a given function.
> >
> > You can get the function * from a fndecl via DECL_STRUCT_FUNCTION.
>
> so once we get fndecl, it should be comparatively smooth sailing from
> there.
>
> My attempt to get the value of function pointer from the state : -
>
> - to access the region model of the state, I tried to access
> “m_region_model” of that state.
> - now I want to access cluster for a function pointer.
> - but when looking at the accessible functions to region model class,
> I couldn’t seem to find the fitting one. ( the closest I could find
> was “region_model::get_reachable_svalues()” to get a set of all the
> svalues reachable from that model )
In general you can use:
region_model::get_rvalue
to go from a tree to a symbolic value for what the analyzer "thinks"
the value of that tree is at that point along the path.
If it "knows" that it's a specific function pointer, then IIRC this
will return a region_svalue where region_svalue::get_pointee () will
(hopefully) point at the function_region representing the memory
holding the code of the function. function_region::get_fndecl should
then give you the tree for the specific FUNCTION_DECL, from which you
can find the supergraph node etc.
It looks like
region_model::get_fndecl_for_call
might already do most of what you need, but it looks like it bails out
for the "NULL cgraph_node" case. Maybe that needs fixing, so that it
returns the fndecl for that case? That already gets used in some
places, so maybe try putting a breakpoint on that and see if fixing
that gets you further?
Hope this is helpful
Dave
More information about the Gcc
mailing list