[cfe-dev] Finding function declaration?

Ben Laurie benl at google.com
Thu May 14 04:19:59 PDT 2015


Manuel asked me for more info.

Given a checker like this:

class MyChecker :
    public Checker< check::PreStmt<ReturnStmt> > {
public:
  void checkPreStmt(const ReturnStmt *RS, CheckerContext &C) const;
};

void MyChecker::checkPreStmt(const ReturnStmt *RS,
     CheckerContext &C) const {
  RS->dump();

  const Stmt *s = RS;

  ParentMap &PM = C.getLocationContext()->getParentMap();

  while ((s = PM.getParent(s)) != NULL) {
    std::cerr << "------\n";
    s->dump();
  }
}

And this as input:

int f(void)
    {
    return 1;
    }


This is the output:

ReturnStmt 0x807cbdda8
`-IntegerLiteral 0x807cbdd88 'int' 1
------
CompoundStmt 0x807cbddc0
`-ReturnStmt 0x807cbdda8
  `-IntegerLiteral 0x807cbdd88 'int' 1

As you can see, it terminates at the function body, not the declaration.


On 14 May 2015 at 07:03, Ben Laurie <benl at google.com> wrote:

>
>
> On 11 May 2015 at 11:20, Manuel Klimek <klimek at google.com> wrote:
>
>> On Sun, May 10, 2015 at 11:54 PM Nikola Smiljanic <popizdeh at gmail.com>
>> wrote:
>>
>>> I think you'll need to use ParentMap from ASTContext.
>>>
>>
>> Note that the parent-map is lazy-built (that is, the first time you get a
>> parent, you build the parent-map for the whole TU), and thus has a pretty
>> high cost. Usually we first try to get away with not using it.
>>
>> Can you give a bit more context on what you're trying to do?
>>
>
> Sorry for delay ... I am trying to label functions to have certain checks
> done on their return values if an attribute is set on the function.
>
> ParentMap appears not to work for this case (it stops finding parents once
> you have the function body).
>
> Currently, the only way I could make this work was to construct a map of
> function bodies that have the attribute set in an AST observer, and then
> using ParentMap to get back to the body, which is looked up in the map.
>
> Doesn't seem optimal!
>
>
>>
>>>
>>> On Mon, May 11, 2015 at 4:18 AM, Ben Laurie <benl at google.com> wrote:
>>>
>>>> If I have a checker for check::PreStmt<ReturnStmt>, how do I get from
>>>> the ReturnStmt to the function it is part of (I want to check
>>>> attributes on that function)?
>>>> _______________________________________________
>>>> cfe-dev mailing list
>>>> cfe-dev at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>>>
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150514/0d85deeb/attachment.html>


More information about the cfe-dev mailing list