summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang
diff options
context:
space:
mode:
Diffstat (limited to 'clang/tools/libclang')
-rw-r--r--clang/tools/libclang/CIndex.cpp82
-rw-r--r--clang/tools/libclang/CIndexCodeCompletion.cpp7
-rw-r--r--clang/tools/libclang/CIndexDiagnostic.cpp15
-rw-r--r--clang/tools/libclang/CIndexHigh.cpp9
-rw-r--r--clang/tools/libclang/CIndexInclusionStack.cpp6
-rw-r--r--clang/tools/libclang/CXSourceLocation.cpp14
-rw-r--r--clang/tools/libclang/CXTranslationUnit.h12
-rw-r--r--clang/tools/libclang/Indexing.cpp4
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;
OpenPOWER on IntegriCloud