[cfe-dev] Need Help in resolving exception while calling FunctionDecl Method

Apoorva Paneliya via cfe-dev cfe-dev at lists.llvm.org
Tue Dec 27 11:49:27 PST 2016


Hi Aleksei,

I tried your below suggestion.

std::unique_ptr<FrontendActionFactory> Factory =
      newFrontendActionFactory(&funcHelper.MatchFinder);
Tool.run(Factory.get());

unfortunately, result is same (still, exception is generated).

It is also a good idea to check that your vector is non-empty before
getting an element. -> *Implemented.*

Let me know if you have any other suggestion.

thank you very much.!!



On Wed, Dec 28, 2016 at 12:06 AM, Aleksei Sidorin <a.sidorin at samsung.com>
wrote:

> > Tool.run(newFrontendActionFactory(&(funcHelper.MatchFinder)).get());
>
> As I can guess, newFrontendActionFactory() returns std::unique_ptr which
> is destructed immediately after this statement is executed. So, it seems
> like you have a memory use-after-free. Try this instead:
>
> std::unique_ptr<FrontendActionFactory> Factory =
>       newFrontendActionFactory(&funcHelper.MatchFinder);
> Tool.run(Factory.get());
>
> Does it help?
>
> It is also a good idea to check that your vector is non-empty before
> getting an element.
>
>
>
> 27.12.2016 17:57, Apoorva Paneliya via cfe-dev пишет:
>
> Hi there,
>
> Just now started with Clang. so, this might silly question.
>
> I am getting exception while calling *FunctionDecl->getNameAsString() or
>  **FunctionDecl->**getName().str()*;
>
> Exception Details:-
>
> Type:-  "Exception thrown: read access violation."
>
> Points to:-
>
> File:- include\clang\AST\DeclarationNames.h
>
> *StoredNameKind getStoredNameKind() const {*
> *    return static_cast<StoredNameKind>(Ptr & PtrMask);*
> *  }*
>
> Actual Code
>
> *Main.cpp*
>
> static llvm::cl::OptionCategory ToolingSampleCategory("Tooling Sample");
>
> int main(int argc, const char **argv)
> {
>
>         CommonOptionsParser OptionsParser(argc, argv,
> ToolingSampleCategory);
> ClangTool Tool(OptionsParser.getCompilations(),
> OptionsParser.getSourcePathList());
>
>         DeclarationMatcher funcMatcher = functionDecl(
> ).bind("functionMatcher");
>
>         *FunctionHelper funcHelper;*
> funcHelper.setNodeBindName("functionMatcher");
> funcHelper.MatchFinder.addMatcher(funcMatcher, &funcHelper);
>
> Tool.run(newFrontendActionFactory(&(funcHelper.MatchFinder)).get());
>
>
> llvm::SmallVector<const clang::FunctionDecl*, 5U> allFuncDecl =
> funcHelper.getAllFunctionDecl();
> const FunctionDecl* fnDecl = allFuncDecl[0];
> * cout << fnDecl->getName().str();  /* Exception Generated while calling
> method.  If same method called from run method then it works. */*
>
>        return 0;
> }
>
>
> *FunctionalHelper.h*
>
>
>                 typedef struct _FunctionInfo
> {
> std::string funcName;
> std::string sourceFileName;
> unsigned int paramCount;
> }FunctionInfo;
>
>
> *class FunctionHelper : public
> clang::ast_matchers::MatchFinder::MatchCallback* {
>
> std::vector<FunctionInfo> m_vec_FunctionInfo;
> std::string m_str_NodeBindName;
> llvm::SmallVector<const clang::FunctionDecl*,5> m_vec_FunctionDecl;
> private:
> void run(const clang::ast_matchers::MatchFinder::MatchResult &Result)
> override
> {
> const clang::FunctionDecl* tempFuncDecl = Result.Nodes.getNodeAs<clang::
> FunctionDecl>(m_str_NodeBindName.c_str());
>
> *                                 // tempFuncDecl ->getName().str();
>  //from here, it's works.*
> if (tempFuncDecl)
> {
> FunctionInfo tempFuncInfo;
> fillFunctionInfo(tempFuncDecl, tempFuncInfo);
>
> m_vec_FunctionInfo.push_back(tempFuncInfo);
> m_vec_FunctionDecl.push_back(tempFuncDecl);
> }
> }
>
> public:
> clang::ast_matchers::MatchFinder MatchFinder;
> void setNodeBindName(std::string nodeBindName) { m_str_NodeBindName =
> nodeBindName; };
>
> std::vector<FunctionInfo> getFuncInfoForAllMatchedNodes()
> {
> return m_vec_FunctionInfo;
> }
> llvm::SmallVector<const clang::FunctionDecl*,5> getAllFunctionDecl()
> {
> return m_vec_FunctionDecl;
> }
>
> static std::string getFunctionName(const clang::FunctionDecl* funcDecl)
> {
> if (!funcDecl) { return ""; }
> return funcDecl->getNameAsString();
> }
>
> static std::string getSourceFileName(const clang::FunctionDecl* funcDecl)
> {
> if (!funcDecl) { return ""; }
> return funcDecl->getASTContext().getSourceManager().getFilename(funcDecl->
> getLocation()).str();
> }
>
> static unsigned int getParamsCount(const clang::FunctionDecl* funcDecl)
> {
> if (!funcDecl) { return 0; }
> return funcDecl->getNumParams();
> }
>
> static void fillFunctionInfo(const clang::FunctionDecl* funcDecl,
> FunctionInfo &funcInfo)
> {
> if (!funcDecl) { return; }
> funcInfo.funcName = FunctionHelper::getFunctionName(funcDecl);
> funcInfo.sourceFileName = FunctionHelper::getSourceFileName(funcDecl);
> funcInfo.paramCount = FunctionHelper::getParamsCount(funcDecl);
> }
> };
>
>
> Config:- 32bit, Debug
> OS:- Windows
> Compiled through VS2015.
> Clang Version:- latest available. [ I guess 4.0]
>
> So, Need help in resolving issue.
> Thanks In Advance.!!
>
> Regards,
> Apoorva
>
>
>
>
>
>
>
> _______________________________________________
> cfe-dev mailing listcfe-dev at lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
>
> --
> Best regards,
> Aleksei Sidorin
> Software Engineer,
> IMSWL-IMCG, SRR, Samsung Electronics
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161228/9d73bcf4/attachment.html>


More information about the cfe-dev mailing list