diff options
Diffstat (limited to 'clang/tools/libclang')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 82 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexCodeCompletion.cpp | 7 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexDiagnostic.cpp | 15 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexHigh.cpp | 9 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexInclusionStack.cpp | 6 | ||||
-rw-r--r-- | clang/tools/libclang/CXSourceLocation.cpp | 14 | ||||
-rw-r--r-- | clang/tools/libclang/CXTranslationUnit.h | 12 | ||||
-rw-r--r-- | clang/tools/libclang/Indexing.cpp | 4 |
8 files changed, 123 insertions, 26 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index f3ab7360b53..268c5b4e5fb 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2845,8 +2845,10 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, *Log << TU << ' ' << FileName; } - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return CXSaveError_InvalidTU; + } ASTUnit *CXXUnit = cxtu::getASTUnit(TU); ASTUnit::ConcurrencyCheck Check(*CXXUnit); @@ -2916,9 +2918,13 @@ struct ReparseTranslationUnitInfo { static void clang_reparseTranslationUnit_Impl(void *UserData) { ReparseTranslationUnitInfo *RTUI = static_cast<ReparseTranslationUnitInfo*>(UserData); + RTUI->result = 1; // Error. + CXTranslationUnit TU = RTUI->TU; - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return; + } // Reset the associated diagnostics. delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics); @@ -2928,7 +2934,6 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files; unsigned options = RTUI->options; (void) options; - RTUI->result = 1; CIndexer *CXXIdx = TU->CIdx; if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) @@ -2986,16 +2991,20 @@ int clang_reparseTranslationUnit(CXTranslationUnit TU, CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) { - if (!CTUnit) + if (isNotUseableTU(CTUnit)) { + LOG_BAD_TU(CTUnit); return cxstring::createEmpty(); + } ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); return cxstring::createDup(CXXUnit->getOriginalSourceFileName()); } CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return clang_getNullCursor(); + } ASTUnit *CXXUnit = cxtu::getASTUnit(TU); return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU); @@ -3025,8 +3034,10 @@ time_t clang_getFileTime(CXFile SFile) { } CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) { - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return 0; + } ASTUnit *CXXUnit = cxtu::getASTUnit(TU); @@ -3034,8 +3045,14 @@ CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) { return const_cast<FileEntry *>(FMgr.getFile(file_name)); } -unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) { - if (!TU || !file) +unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, + CXFile file) { + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return 0; + } + + if (!file) return 0; ASTUnit *CXXUnit = cxtu::getASTUnit(TU); @@ -3928,8 +3945,10 @@ static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor, } CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) { - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return clang_getNullCursor(); + } ASTUnit *CXXUnit = cxtu::getASTUnit(TU); ASTUnit::ConcurrencyCheck Check(*CXXUnit); @@ -4889,6 +4908,11 @@ CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { break; } + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return cxstring::createEmpty(); + } + // We have to find the starting buffer pointer the hard way, by // deconstructing the source location. ASTUnit *CXXUnit = cxtu::getASTUnit(TU); @@ -4908,6 +4932,11 @@ CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { } CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return clang_getNullLocation(); + } + ASTUnit *CXXUnit = cxtu::getASTUnit(TU); if (!CXXUnit) return clang_getNullLocation(); @@ -4917,6 +4946,11 @@ CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { } CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return clang_getNullRange(); + } + ASTUnit *CXXUnit = cxtu::getASTUnit(TU); if (!CXXUnit) return clang_getNullRange(); @@ -5008,8 +5042,10 @@ void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, if (NumTokens) *NumTokens = 0; - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return; + } ASTUnit *CXXUnit = cxtu::getASTUnit(TU); if (!CXXUnit || !Tokens || !NumTokens) @@ -5729,7 +5765,11 @@ extern "C" { void clang_annotateTokens(CXTranslationUnit TU, CXToken *Tokens, unsigned NumTokens, CXCursor *Cursors) { - if (!TU || NumTokens == 0 || !Tokens || !Cursors) { + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return; + } + if (NumTokens == 0 || !Tokens || !Cursors) { LOG_FUNC_SECTION { *Log << "<null input>"; } return; } @@ -6232,7 +6272,11 @@ CXString clang_Module_getFullName(CXModule CXMod) { unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU, CXModule CXMod) { - if (!TU || !CXMod) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return 0; + } + if (!CXMod) return 0; Module *Mod = static_cast<Module*>(CXMod); FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); @@ -6242,7 +6286,11 @@ unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU, CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, CXModule CXMod, unsigned Index) { - if (!TU || !CXMod) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return 0; + } + if (!CXMod) return 0; Module *Mod = static_cast<Module*>(CXMod); FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); @@ -6373,7 +6421,8 @@ const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) { } CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { - if (!TU) { + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); CXTUResourceUsage usage = { (void*) 0, 0, 0 }; return usage; } @@ -6474,6 +6523,11 @@ CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) { skipped->count = 0; skipped->ranges = 0; + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return skipped; + } + if (!file) return skipped; diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp index 04adb590498..0a978566f94 100644 --- a/clang/tools/libclang/CIndexCodeCompletion.cpp +++ b/clang/tools/libclang/CIndexCodeCompletion.cpp @@ -680,7 +680,12 @@ void clang_codeCompleteAt_Impl(void *UserData) { #endif bool EnableLogging = getenv("LIBCLANG_CODE_COMPLETION_LOGGING") != 0; - + + if (cxtu::isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return; + } + ASTUnit *AST = cxtu::getASTUnit(TU); if (!AST) return; diff --git a/clang/tools/libclang/CIndexDiagnostic.cpp b/clang/tools/libclang/CIndexDiagnostic.cpp index 0e9dde8d1ed..dec32285158 100644 --- a/clang/tools/libclang/CIndexDiagnostic.cpp +++ b/clang/tools/libclang/CIndexDiagnostic.cpp @@ -208,12 +208,21 @@ CXDiagnosticSetImpl *cxdiag::lazyCreateDiags(CXTranslationUnit TU, extern "C" { unsigned clang_getNumDiagnostics(CXTranslationUnit Unit) { + if (cxtu::isNotUseableTU(Unit)) { + LOG_BAD_TU(Unit); + return 0; + } if (!cxtu::getASTUnit(Unit)) return 0; return lazyCreateDiags(Unit, /*checkIfChanged=*/true)->getNumDiagnostics(); } CXDiagnostic clang_getDiagnostic(CXTranslationUnit Unit, unsigned Index) { + if (cxtu::isNotUseableTU(Unit)) { + LOG_BAD_TU(Unit); + return 0; + } + CXDiagnosticSet D = clang_getDiagnosticSetFromTU(Unit); if (!D) return 0; @@ -224,8 +233,12 @@ CXDiagnostic clang_getDiagnostic(CXTranslationUnit Unit, unsigned Index) { return Diags->getDiagnostic(Index); } - + CXDiagnosticSet clang_getDiagnosticSetFromTU(CXTranslationUnit Unit) { + if (cxtu::isNotUseableTU(Unit)) { + LOG_BAD_TU(Unit); + return 0; + } if (!cxtu::getASTUnit(Unit)) return 0; return static_cast<CXDiagnostic>(lazyCreateDiags(Unit)); diff --git a/clang/tools/libclang/CIndexHigh.cpp b/clang/tools/libclang/CIndexHigh.cpp index c772dbbcb90..521514fefbb 100644 --- a/clang/tools/libclang/CIndexHigh.cpp +++ b/clang/tools/libclang/CIndexHigh.cpp @@ -480,13 +480,12 @@ CXResult clang_findReferencesInFile(CXCursor cursor, CXFile file, CXResult clang_findIncludesInFile(CXTranslationUnit TU, CXFile file, CXCursorAndRangeVisitor visitor) { - LogRef Log = Logger::make(LLVM_FUNCTION_NAME); - - if (!TU) { - if (Log) - *Log << "Null CXTranslationUnit"; + if (cxtu::isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return CXResult_Invalid; } + + LogRef Log = Logger::make(LLVM_FUNCTION_NAME); if (!file) { if (Log) *Log << "Null file"; diff --git a/clang/tools/libclang/CIndexInclusionStack.cpp b/clang/tools/libclang/CIndexInclusionStack.cpp index a6d3115409b..2a56593b9dc 100644 --- a/clang/tools/libclang/CIndexInclusionStack.cpp +++ b/clang/tools/libclang/CIndexInclusionStack.cpp @@ -24,7 +24,11 @@ using namespace clang; extern "C" { void clang_getInclusions(CXTranslationUnit TU, CXInclusionVisitor CB, CXClientData clientData) { - + if (cxtu::isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return; + } + ASTUnit *CXXUnit = cxtu::getASTUnit(TU); SourceManager &SM = CXXUnit->getSourceManager(); ASTContext &Ctx = CXXUnit->getASTContext(); diff --git a/clang/tools/libclang/CXSourceLocation.cpp b/clang/tools/libclang/CXSourceLocation.cpp index 73711772fc0..c17449ae364 100644 --- a/clang/tools/libclang/CXSourceLocation.cpp +++ b/clang/tools/libclang/CXSourceLocation.cpp @@ -122,7 +122,11 @@ CXSourceLocation clang_getLocation(CXTranslationUnit TU, CXFile file, unsigned line, unsigned column) { - if (!TU || !file) + if (cxtu::isNotUseableTU(TU)) { + LOG_BAD_TU(TU); + return clang_getNullLocation(); + } + if (!file) return clang_getNullLocation(); if (line == 0 || column == 0) return clang_getNullLocation(); @@ -151,9 +155,13 @@ CXSourceLocation clang_getLocation(CXTranslationUnit TU, CXSourceLocation clang_getLocationForOffset(CXTranslationUnit TU, CXFile file, unsigned offset) { - if (!TU || !file) + if (cxtu::isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return clang_getNullLocation(); - + } + if (!file) + return clang_getNullLocation(); + ASTUnit *CXXUnit = cxtu::getASTUnit(TU); SourceLocation SLoc diff --git a/clang/tools/libclang/CXTranslationUnit.h b/clang/tools/libclang/CXTranslationUnit.h index 266c6fd96ac..c320bb19293 100644 --- a/clang/tools/libclang/CXTranslationUnit.h +++ b/clang/tools/libclang/CXTranslationUnit.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_CXTRANSLATIONUNIT_H #include "CXString.h" +#include "CLog.h" #include "clang-c/Index.h" namespace clang { @@ -45,6 +46,17 @@ static inline ASTUnit *getASTUnit(CXTranslationUnit TU) { return TU->TheASTUnit; } +static inline bool isNotUseableTU(CXTranslationUnit TU) { + return !TU; +} + +#define LOG_BAD_TU(TU) \ + do { \ + LOG_FUNC_SECTION { \ + *Log << "called with a bad TU: " << TU; \ + } \ + } while(false) + class CXTUOwner { CXTranslationUnitImpl *TU; diff --git a/clang/tools/libclang/Indexing.cpp b/clang/tools/libclang/Indexing.cpp index 99fcdb692ad..7fb27bf258c 100644 --- a/clang/tools/libclang/Indexing.cpp +++ b/clang/tools/libclang/Indexing.cpp @@ -756,8 +756,10 @@ static void clang_indexTranslationUnit_Impl(void *UserData) { unsigned index_options = ITUI->index_options; ITUI->result = 1; // init as error. - if (!TU) + if (isNotUseableTU(TU)) { + LOG_BAD_TU(TU); return; + } if (!client_index_callbacks || index_callbacks_size == 0) return; |