]> granicus.if.org Git - clang/commitdiff
DiagnosticIds: Fix offset/ID calculation, no impact outside this code.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 2 Jan 2013 22:26:07 +0000 (22:26 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 2 Jan 2013 22:26:07 +0000 (22:26 +0000)
Patch by Will Dietz:

Minor touchup so the values of Offset/ID reflect their intention.
Previously, the sum (Offset+ID) was correct, but Offset/ID
individually were wrong.

Caught by investigating unsigned overflow reported by -fsanitize=integer.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171421 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/DiagnosticIDs.cpp

index 4716a449a7cdf894bb4f0afac171176cb5b54448..e1f400adaa56792ece0150bcf7ec406fd2628d8a 100644 (file)
@@ -125,8 +125,8 @@ static const StaticDiagInfoRec *GetDiagInfo(unsigned DiagID) {
 #define DIAG_START_COMMON 0 // Sentinel value.
 #define CATEGORY(NAME, PREV) \
   if (DiagID > DIAG_START_##NAME) { \
-    Offset += NUM_BUILTIN_##PREV##_DIAGNOSTICS - DIAG_START_##PREV; \
-    ID -= DIAG_START_##NAME - DIAG_START_##PREV + 1; \
+    Offset += NUM_BUILTIN_##PREV##_DIAGNOSTICS - DIAG_START_##PREV - 1; \
+    ID -= DIAG_START_##NAME - DIAG_START_##PREV; \
   }
 CATEGORY(DRIVER, COMMON)
 CATEGORY(FRONTEND, DRIVER)
@@ -144,6 +144,8 @@ CATEGORY(ANALYSIS, SEMA)
   if (ID + Offset >= StaticDiagInfoSize)
     return 0;
 
+  assert(ID < StaticDiagInfoSize && Offset < StaticDiagInfoSize);
+
   const StaticDiagInfoRec *Found = &StaticDiagInfo[ID + Offset];
   // If the diag id doesn't match we found a different diag, abort. This can
   // happen when this function is called with an ID that points into a hole in