Revert "[analyzer] Fix function macro crash"
authorKristof Umann <dkszelethus@gmail.com>
Tue, 12 Mar 2019 11:22:30 +0000 (11:22 +0000)
committerKristof Umann <dkszelethus@gmail.com>
Tue, 12 Mar 2019 11:22:30 +0000 (11:22 +0000)
Buildbot breaks when LLVm is compiled with memory sanitizer.

WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0xa3d16d8 in getMacroNameAndPrintExpansion(blahblah)
                             lib/StaticAnalyzer/Core/PlistDiagnostics.cpp:903:11
llvm-svn: 355911

clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist
clang/test/Analysis/plist-macros-with-expansion.cpp

index 378c76c1bcad87207553d0b82dfc58bead70848b..92d0720448ef045586b1eb9d7ce5ebc9bd788f50 100644 (file)
@@ -900,7 +900,7 @@ static std::string getMacroNameAndPrintExpansion(
       // If this is a function-like macro, skip its arguments, as
       // getExpandedMacro() already printed them. If this is the case, let's
       // first jump to the '(' token.
-      if (std::next(It)->is(tok::l_paren))
+      if (MI->getNumParams() != 0)
         It = getMatchingRParen(++It, E);
       continue;
     }
@@ -928,15 +928,7 @@ static std::string getMacroNameAndPrintExpansion(
 
         getMacroNameAndPrintExpansion(Printer, ArgIt->getLocation(), PP,
                                       Info.Args, AlreadyProcessedTokens);
-        // Peek the next token if it is a tok::l_paren. This way we can decide
-        // if this is the application or just a reference to a function maxro
-        // symbol:
-        //
-        // #define apply(f) ...
-        // #define func(x) ...
-        // apply(func)
-        // apply(func(42))
-        if (std::next(ArgIt)->is(tok::l_paren))
+        if (MI->getNumParams() != 0)
           ArgIt = getMatchingRParen(++ArgIt, ArgEnd);
       }
       continue;
@@ -998,16 +990,8 @@ static MacroNameAndArgs getMacroNameAndArgs(SourceLocation ExpanLoc,
     return { MacroName, MI, {} };
 
   RawLexer.LexFromRawLexer(TheTok);
-  // When this is a token which expands to another macro function then its
-  // parentheses are not at its expansion locaiton. For example:
-  //
-  // #define foo(x) int bar() { return x; }
-  // #define apply_zero(f) f(0)
-  // apply_zero(foo)
-  //               ^
-  //               This is not a tok::l_paren, but foo is a function.
-  if (TheTok.isNot(tok::l_paren))
-    return { MacroName, MI, {} };
+  assert(TheTok.is(tok::l_paren) &&
+         "The token after the macro's identifier token should be '('!");
 
   MacroArgMap Args;
 
index a31063ac680acd52ca10fe9c7e65926237a1aaf5..68f02a38fdf5d5915668c146a934cdfa5fec8164 100644 (file)
    </array>
   </dict>
   </dict>
-  <dict>
-   <key>path</key>
-   <array>
-    <dict>
-     <key>kind</key><string>control</string>
-     <key>edges</key>
-      <array>
-       <dict>
-        <key>start</key>
-         <array>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>33</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>33</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-        <key>end</key>
-         <array>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>37</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>39</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-       </dict>
-      </array>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>459</integer>
-      <key>col</key><integer>37</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>459</integer>
-         <key>col</key><integer>37</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>459</integer>
-         <key>col</key><integer>41</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>0</integer>
-     <key>extended_message</key>
-     <string>Calling &apos;foo&apos;</string>
-     <key>message</key>
-     <string>Calling &apos;foo&apos;</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>458</integer>
-      <key>col</key><integer>1</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>depth</key><integer>1</integer>
-     <key>extended_message</key>
-     <string>Entered call from &apos;useZeroApplier1&apos;</string>
-     <key>message</key>
-     <string>Entered call from &apos;useZeroApplier1&apos;</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>458</integer>
-      <key>col</key><integer>1</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>458</integer>
-         <key>col</key><integer>1</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>458</integer>
-         <key>col</key><integer>16</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>1</integer>
-     <key>extended_message</key>
-     <string>Returning zero</string>
-     <key>message</key>
-     <string>Returning zero</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>459</integer>
-      <key>col</key><integer>37</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>459</integer>
-         <key>col</key><integer>37</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>459</integer>
-         <key>col</key><integer>41</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>0</integer>
-     <key>extended_message</key>
-     <string>Returning from &apos;foo&apos;</string>
-     <key>message</key>
-     <string>Returning from &apos;foo&apos;</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>control</string>
-     <key>edges</key>
-      <array>
-       <dict>
-        <key>start</key>
-         <array>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>37</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>39</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-        <key>end</key>
-         <array>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>35</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>459</integer>
-           <key>col</key><integer>35</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-       </dict>
-      </array>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>459</integer>
-      <key>col</key><integer>35</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>459</integer>
-         <key>col</key><integer>33</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>459</integer>
-         <key>col</key><integer>41</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>0</integer>
-     <key>extended_message</key>
-     <string>Division by zero</string>
-     <key>message</key>
-     <string>Division by zero</string>
-    </dict>
-   </array>
-   <key>macro_expansions</key>
-   <array>
-    <dict>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>458</integer>
-      <key>col</key><integer>1</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>name</key><string>APPLY_ZERO1</string>
-     <key>expansion</key><string>int foo() { return x; }(0)</string>
-    </dict>
-   </array>
-   <key>description</key><string>Division by zero</string>
-   <key>category</key><string>Logic error</string>
-   <key>type</key><string>Division by zero</string>
-   <key>check_name</key><string>core.DivideZero</string>
-   <!-- This hash is experimental and going to change! -->
-   <key>issue_hash_content_of_line_in_context</key><string>7ff82561a6c752746649d05220deeb40</string>
-  <key>issue_context_kind</key><string>function</string>
-  <key>issue_context</key><string>useZeroApplier1</string>
-  <key>issue_hash_function_offset</key><string>0</string>
-  <key>location</key>
-  <dict>
-   <key>line</key><integer>459</integer>
-   <key>col</key><integer>35</integer>
-   <key>file</key><integer>0</integer>
-  </dict>
-  <key>ExecutedLines</key>
-  <dict>
-   <key>0</key>
-   <array>
-    <integer>458</integer>
-    <integer>459</integer>
-   </array>
-  </dict>
-  </dict>
-  <dict>
-   <key>path</key>
-   <array>
-    <dict>
-     <key>kind</key><string>control</string>
-     <key>edges</key>
-      <array>
-       <dict>
-        <key>start</key>
-         <array>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>33</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>33</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-        <key>end</key>
-         <array>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>37</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>39</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-       </dict>
-      </array>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>468</integer>
-      <key>col</key><integer>37</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>468</integer>
-         <key>col</key><integer>37</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>468</integer>
-         <key>col</key><integer>41</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>0</integer>
-     <key>extended_message</key>
-     <string>Calling &apos;bar&apos;</string>
-     <key>message</key>
-     <string>Calling &apos;bar&apos;</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>467</integer>
-      <key>col</key><integer>1</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>depth</key><integer>1</integer>
-     <key>extended_message</key>
-     <string>Entered call from &apos;useZeroApplier2&apos;</string>
-     <key>message</key>
-     <string>Entered call from &apos;useZeroApplier2&apos;</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>467</integer>
-      <key>col</key><integer>1</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>467</integer>
-         <key>col</key><integer>1</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>467</integer>
-         <key>col</key><integer>11</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>1</integer>
-     <key>extended_message</key>
-     <string>Returning zero</string>
-     <key>message</key>
-     <string>Returning zero</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>468</integer>
-      <key>col</key><integer>37</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>468</integer>
-         <key>col</key><integer>37</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>468</integer>
-         <key>col</key><integer>41</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>0</integer>
-     <key>extended_message</key>
-     <string>Returning from &apos;bar&apos;</string>
-     <key>message</key>
-     <string>Returning from &apos;bar&apos;</string>
-    </dict>
-    <dict>
-     <key>kind</key><string>control</string>
-     <key>edges</key>
-      <array>
-       <dict>
-        <key>start</key>
-         <array>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>37</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>39</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-        <key>end</key>
-         <array>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>35</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-          <dict>
-           <key>line</key><integer>468</integer>
-           <key>col</key><integer>35</integer>
-           <key>file</key><integer>0</integer>
-          </dict>
-         </array>
-       </dict>
-      </array>
-    </dict>
-    <dict>
-     <key>kind</key><string>event</string>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>468</integer>
-      <key>col</key><integer>35</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>ranges</key>
-     <array>
-       <array>
-        <dict>
-         <key>line</key><integer>468</integer>
-         <key>col</key><integer>33</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-        <dict>
-         <key>line</key><integer>468</integer>
-         <key>col</key><integer>41</integer>
-         <key>file</key><integer>0</integer>
-        </dict>
-       </array>
-     </array>
-     <key>depth</key><integer>0</integer>
-     <key>extended_message</key>
-     <string>Division by zero</string>
-     <key>message</key>
-     <string>Division by zero</string>
-    </dict>
-   </array>
-   <key>macro_expansions</key>
-   <array>
-    <dict>
-     <key>location</key>
-     <dict>
-      <key>line</key><integer>467</integer>
-      <key>col</key><integer>1</integer>
-      <key>file</key><integer>0</integer>
-     </dict>
-     <key>name</key><string>APPLY_ZERO2</string>
-     <key>expansion</key><string>int bar() { return 0; }</string>
-    </dict>
-   </array>
-   <key>description</key><string>Division by zero</string>
-   <key>category</key><string>Logic error</string>
-   <key>type</key><string>Division by zero</string>
-   <key>check_name</key><string>core.DivideZero</string>
-   <!-- This hash is experimental and going to change! -->
-   <key>issue_hash_content_of_line_in_context</key><string>dd82c11b436b00009e37f54b1620a728</string>
-  <key>issue_context_kind</key><string>function</string>
-  <key>issue_context</key><string>useZeroApplier2</string>
-  <key>issue_hash_function_offset</key><string>0</string>
-  <key>location</key>
-  <dict>
-   <key>line</key><integer>468</integer>
-   <key>col</key><integer>35</integer>
-   <key>file</key><integer>0</integer>
-  </dict>
-  <key>ExecutedLines</key>
-  <dict>
-   <key>0</key>
-   <array>
-    <integer>467</integer>
-    <integer>468</integer>
-   </array>
-  </dict>
-  </dict>
  </array>
  <key>files</key>
  <array>
index c062a4782c5898d713bc1c1c0793fb5a896f1dd9..057a165f946569efeec76453c76163cc7247e147 100644 (file)
@@ -451,21 +451,3 @@ void recursiveMacroUser() {
     1 / value; // expected-warning{{Division by zero}}
                // expected-warning@-1{{expression result unused}}
 }
-
-#define FOO(x) int foo() { return x; }
-#define APPLY_ZERO1(function) function(0)
-
-APPLY_ZERO1(FOO)
-void useZeroApplier1() { (void)(1 / foo()); } // expected-warning{{Division by zero}}
-
-// CHECK: <key>name</key><string>APPLY_ZERO1</string>
-// CHECK-NEXT: <key>expansion</key><string>int foo() { return x; }(0)</string>
-
-#define BAR(x) int bar() { return x; }
-#define APPLY_ZERO2 BAR(0)
-
-APPLY_ZERO2
-void useZeroApplier2() { (void)(1 / bar()); } // expected-warning{{Division by zero}}
-
-// CHECK: <key>name</key><string>APPLY_ZERO2</string>
-// CHECK-NEXT: <key>expansion</key><string>int bar() { return 0; }</string>