[cfe-dev] FullSourceLoc, getSpellingLineNumber segmentation fault

victor via cfe-dev cfe-dev at lists.llvm.org
Tue Mar 1 01:51:29 PST 2016

Hi Mikhail,

Well, let me explain you what I'm doing:

1) I'm using LibTooling, so I run the tool "Tool.run()" to start the traveral of the AST.
2) At one point during the execution, I need to know some information about the AST, so I call "TraverseDecl" and the AST is visited recursively with VisitMemberExpr. 

By doing this, I'm calling internally to Tool.BuildAST() twice, right? I think I'm not using virtual files.

So, what can I do? The thing is that I don't know when a call to this method is going to crash. 

Maybe, should I look first in the AST if the MemberExpr has a parent CXXMemberCallExpr?

From: mikhail.ramalho at gmail.com
Date: Mon, 29 Feb 2016 19:16:28 +0000
Subject: Re: [cfe-dev] FullSourceLoc, getSpellingLineNumber segmentation fault
To: pedretti_86 at hotmail.com
CC: cfe-dev at lists.llvm.org

I used to face a lot of crashes on this method, it would usually explode at some #__SSE2__ code in a static method called ComputeLineNumbers inside clang.
Are you using virtual files? Are you generating the AST more than once (I mean, calling Tool.BuildAST() more than once)?
I don't quite remember how I fixed, but I _think_ those two might have something to do with the problem.

2016-02-29 18:22 GMT+00:00 victor via cfe-dev <cfe-dev at lists.llvm.org>:


Does somebody know what can make the method getSpellingLineNumber from FullSourceLoc to generate a segmentation fault?  I'm using clang 3.6.


Before using this method, I have checked that the FullSourceLoc is valid. This is the code:


            if(Context->getSourceManager().getFileEntryForID(loc.getFileID()) != NULL){

                   unsigned int = loc.getSpellingLineNumber();

I can't find anything special in the code which I'm using to check if my program works:

    void DeleteNode( XMLNode* node )    {
        node->_parent->DeleteChild( node );

And this is the tree:

| | |-CXXMethodDecl 0x26b4090 <line:1576:5, line:1578:5> line:1576:10 DeleteNode 'void (class tinyxml2::XMLNode *)'
| | | |-ParmVarDecl 0x26b4010 <col:22, col:31> col:31 used node 'class tinyxml2::XMLNode *'
| | | |-CompoundStmt 0x26c9500 <col:38, line:1578:5>
| | | | `-CXXMemberCallExpr 0x26c94b8 <line:1577:9, col:42> 'void'
| | | |   |-MemberExpr 0x26c9460 <col:9, col:24> '<bound member function type>' ->DeleteChild 0x2699420
| | | |   | `-ImplicitCastExpr 0x26c9448 <col:9, col:15> 'class tinyxml2::XMLNode *' <LValueToRValue>
| | | |   |   `-MemberExpr 0x26c9418 <col:9, col:15> 'class tinyxml2::XMLNode *' lvalue ->_parent 0x269a310
| | | |   |     `-ImplicitCastExpr 0x26c9400 <col:9> 'class tinyxml2::XMLNode *' <LValueToRValue>
| | | |   |       `-DeclRefExpr 0x26c93d8 <col:9> 'class tinyxml2::XMLNode *' lvalue ParmVar 0x26b4010 'node' 'class tinyxml2::XMLNode *'

The object "loc" contains the location of the MemberExpr "_parent". 



cfe-dev mailing list

cfe-dev at lists.llvm.org



Mikhail Ramalho.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160301/ebca3333/attachment.html>

More information about the cfe-dev mailing list