invalid free for CompilerInstance

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

invalid free for CompilerInstance

Oleg Smolsky via cfe-dev
Hi all,

I have the following code. The process works well but finally crashes at the last minute (delete CI) with "free(): invalid pointer”.

I appreciate any help you can give me.

bool run(std::string InputFileName, Action *R) {
CI = new clang::CompilerInstance();
assert(CI);

CI->createDiagnostics();
clang::TargetOptions &TO = CI->getTargetOpts();
TO.Triple = llvm::sys::getDefaultTargetTriple();
clang::TargetInfo *Target = clang::TargetInfo::CreateTargetInfo(
    CI->getDiagnostics(), CI->getInvocation().TargetOpts);
CI->setTarget(Target);

CI->createFileManager();
CI->createSourceManager(CI->getFileManager());
CI->createPreprocessor(clang::TU_Complete);
CI->createASTContext();
CI->setASTConsumer(std::unique_ptr<clang::ASTConsumer>(R));
clang::Preprocessor &PP = CI->getPreprocessor();
PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(),
                                       PP.getLangOpts());

if (!CI->InitializeSourceManager(
        clang::FrontendInputFile(InputFileName, clang::InputKind::C))) {
  return false;
}

CI->createSema(clang::TU_Complete, 0);
clang::DiagnosticsEngine &Diag = CI->getDiagnostics();
Diag.setSuppressAllDiagnostics(true);
Diag.setIgnoreAllWarnings(true);

ParseAST(CI->getSema());

CI->getDiagnosticClient().EndSourceFile();

delete CI;   // abort
return true;
}

Thanks,
Kihong
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: invalid free for CompilerInstance

Oleg Smolsky via cfe-dev
The message you see is a diagnostic message from your C library warning you that the value passed in to free() (via this "delete CI" statement) is not a pointer to something that was allocated by malloc() (via new or otherwise).

A common cause for this kind of problem is some kind of heap or stack corruption.  Best to build your code with many warnings enabled and consider also using ASan (Address Sanitizer).  It's great at quickly identifying the root cause of problems like this.  If warnings and ASan don't quickly identify the issue, decrease the scope [delete/disable code] until you find the critical scope necessary to cause the problem and you will at least have a smaller area to search for bugs.

Also, as an aside (it won't help fix the problem that you reported) -- consider using a smart pointer like std::unique_ptr for something like this "CI" variable.  For example, in this code, 'CI' leaks if the call to InitializeSourceManager() fails.


On Sat, Nov 24, 2018 at 11:15 PM Kihong Heo via cfe-dev <[hidden email]> wrote:
Hi all,

I have the following code. The process works well but finally crashes at the last minute (delete CI) with "free(): invalid pointer”.

I appreciate any help you can give me.

bool run(std::string InputFileName, Action *R) {
CI = new clang::CompilerInstance();
assert(CI);

CI->createDiagnostics();
clang::TargetOptions &TO = CI->getTargetOpts();
TO.Triple = llvm::sys::getDefaultTargetTriple();
clang::TargetInfo *Target = clang::TargetInfo::CreateTargetInfo(
    CI->getDiagnostics(), CI->getInvocation().TargetOpts);
CI->setTarget(Target);

CI->createFileManager();
CI->createSourceManager(CI->getFileManager());
CI->createPreprocessor(clang::TU_Complete);
CI->createASTContext();
CI->setASTConsumer(std::unique_ptr<clang::ASTConsumer>(R));
clang::Preprocessor &PP = CI->getPreprocessor();
PP.getBuiltinInfo().initializeBuiltins(PP.getIdentifierTable(),
                                       PP.getLangOpts());

if (!CI->InitializeSourceManager(
        clang::FrontendInputFile(InputFileName, clang::InputKind::C))) {
  return false;
}

CI->createSema(clang::TU_Complete, 0);
clang::DiagnosticsEngine &Diag = CI->getDiagnostics();
Diag.setSuppressAllDiagnostics(true);
Diag.setIgnoreAllWarnings(true);

ParseAST(CI->getSema());

CI->getDiagnosticClient().EndSourceFile();

delete CI;   // abort
return true;
}

Thanks,
Kihong
_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev


--
-Brian

_______________________________________________
cfe-dev mailing list
[hidden email]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev