invalid free for CompilerInstance

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

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.