summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/Diagnostic.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-15 18:48:23 +0000
committerChris Lattner <sabre@nondot.org>2009-04-15 18:48:23 +0000
commitd9ecb8e279c63ecb6ed9790345df0d5cf8e27cfd (patch)
tree4b90b7b0ddbf1dace084be5a7d09f5504d314902 /clang/lib/Basic/Diagnostic.cpp
parente95304ac93c84487682f74d2a49963be0e1785d1 (diff)
downloadbcm5719-llvm-d9ecb8e279c63ecb6ed9790345df0d5cf8e27cfd.tar.gz
bcm5719-llvm-d9ecb8e279c63ecb6ed9790345df0d5cf8e27cfd.zip
fix some out of bounds array access problems, which manifest particularly
spectacularly when built for x86-64. llvm-svn: 69197
Diffstat (limited to 'clang/lib/Basic/Diagnostic.cpp')
-rw-r--r--clang/lib/Basic/Diagnostic.cpp55
1 files changed, 37 insertions, 18 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp
index 27041354f82..caf30fac633 100644
--- a/clang/lib/Basic/Diagnostic.cpp
+++ b/clang/lib/Basic/Diagnostic.cpp
@@ -105,24 +105,43 @@ static unsigned char DiagnosticClassesAnalysis[] = {
static unsigned getBuiltinDiagClass(unsigned DiagID) {
assert(DiagID < diag::DIAG_UPPER_LIMIT &&
"Diagnostic ID out of range!");
- unsigned res;
- if (DiagID < diag::DIAG_START_DRIVER)
- res = DiagnosticClassesCommon[DiagID];
- else if (DiagID < diag::DIAG_START_FRONTEND)
- res = DiagnosticClassesDriver[DiagID - diag::DIAG_START_DRIVER - 1];
- else if (DiagID < diag::DIAG_START_LEX)
- res = DiagnosticClassesFrontend[DiagID - diag::DIAG_START_FRONTEND - 1];
- else if (DiagID < diag::DIAG_START_PARSE)
- res = DiagnosticClassesLex[DiagID - diag::DIAG_START_LEX - 1];
- else if (DiagID < diag::DIAG_START_AST)
- res = DiagnosticClassesParse[DiagID - diag::DIAG_START_PARSE - 1];
- else if (DiagID < diag::DIAG_START_SEMA)
- res = DiagnosticClassesAST[DiagID - diag::DIAG_START_AST - 1];
- else if (DiagID < diag::DIAG_START_ANALYSIS)
- res = DiagnosticClassesSema[DiagID - diag::DIAG_START_SEMA - 1];
- else
- res = DiagnosticClassesAnalysis[DiagID - diag::DIAG_START_ANALYSIS - 1];
- return res;
+ unsigned char *Arr;
+ unsigned ArrSize;
+ if (DiagID <= diag::DIAG_START_DRIVER) {
+ DiagID -= 0;
+ Arr = DiagnosticClassesCommon;
+ ArrSize = sizeof(DiagnosticClassesCommon);
+ } else if (DiagID <= diag::DIAG_START_FRONTEND) {
+ DiagID -= diag::DIAG_START_DRIVER + 1;
+ Arr = DiagnosticClassesDriver;
+ ArrSize = sizeof(DiagnosticClassesDriver);
+ } else if (DiagID <= diag::DIAG_START_LEX) {
+ DiagID -= diag::DIAG_START_FRONTEND + 1;
+ Arr = DiagnosticClassesFrontend;
+ ArrSize = sizeof(DiagnosticClassesFrontend);
+ } else if (DiagID <= diag::DIAG_START_PARSE) {
+ DiagID -= diag::DIAG_START_LEX + 1;
+ Arr = DiagnosticClassesLex;
+ ArrSize = sizeof(DiagnosticClassesLex);
+ } else if (DiagID <= diag::DIAG_START_AST) {
+ DiagID -= diag::DIAG_START_PARSE + 1;
+ Arr = DiagnosticClassesParse;
+ ArrSize = sizeof(DiagnosticClassesParse);
+ } else if (DiagID <= diag::DIAG_START_SEMA) {
+ DiagID -= diag::DIAG_START_AST + 1;
+ Arr = DiagnosticClassesAST;
+ ArrSize = sizeof(DiagnosticClassesAST);
+
+ } else if (DiagID <= diag::DIAG_START_ANALYSIS) {
+ DiagID -= diag::DIAG_START_SEMA + 1;
+ Arr = DiagnosticClassesSema;
+ ArrSize = sizeof(DiagnosticClassesSema);
+ } else {
+ DiagID -= diag::DIAG_START_ANALYSIS + 1;
+ Arr = DiagnosticClassesAnalysis;
+ ArrSize = sizeof(DiagnosticClassesAnalysis);
+ }
+ return DiagID < ArrSize ? Arr[DiagID] : ~0U;
}
/// DiagnosticText - An english message to print for the diagnostic. These
OpenPOWER on IntegriCloud