diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2014-02-11 14:34:14 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2014-02-11 14:34:14 +0000 |
commit | 256454fdaa4d3d044a80c2991b210ca3d2bf2a24 (patch) | |
tree | 9b5b2b53a26df69747a82bf429ba63abd5332635 /clang/tools/libclang/CIndex.cpp | |
parent | e5a447d947ebbd622757fb19e424c0ee5445bbcb (diff) | |
download | bcm5719-llvm-256454fdaa4d3d044a80c2991b210ca3d2bf2a24.tar.gz bcm5719-llvm-256454fdaa4d3d044a80c2991b210ca3d2bf2a24.zip |
libclang: audit all APIs that accept a CXTranslationUnit to make sure that
checks for invalid translation unit are in place. Also, while there, add log
output for this case.
llvm-svn: 201155
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 82 |
1 files changed, 68 insertions, 14 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; |