bruntib updated this revision to Diff 190485. bruntib added a comment. I added a condition before std::next() invocations to check if the next element is inside the valid interval. This fixes the crash of the build-bot. Sorry for the ugly bug. I don't know if there is a more elegant solution.
Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D57893/new/ https://reviews.llvm.org/D57893 Files: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist test/Analysis/plist-macros-with-expansion.cpp
Index: test/Analysis/plist-macros-with-expansion.cpp =================================================================== --- test/Analysis/plist-macros-with-expansion.cpp +++ test/Analysis/plist-macros-with-expansion.cpp @@ -451,3 +451,21 @@ 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> Index: test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist =================================================================== --- test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist +++ test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist @@ -5577,6 +5577,484 @@ </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 'foo'</string> + <key>message</key> + <string>Calling 'foo'</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 'useZeroApplier1'</string> + <key>message</key> + <string>Entered call from 'useZeroApplier1'</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 'foo'</string> + <key>message</key> + <string>Returning from 'foo'</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 'bar'</string> + <key>message</key> + <string>Calling 'bar'</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 'useZeroApplier2'</string> + <key>message</key> + <string>Entered call from 'useZeroApplier2'</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 'bar'</string> + <key>message</key> + <string>Returning from 'bar'</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: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp =================================================================== --- lib/StaticAnalyzer/Core/PlistDiagnostics.cpp +++ lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -900,7 +900,7 @@ // 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 (MI->getNumParams() != 0) + if (It < E - 1 && std::next(It)->is(tok::l_paren)) It = getMatchingRParen(++It, E); continue; } @@ -928,7 +928,15 @@ getMacroNameAndPrintExpansion(Printer, ArgIt->getLocation(), PP, Info.Args, AlreadyProcessedTokens); - if (MI->getNumParams() != 0) + // 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 (ArgIt < ArgEnd - 1 && std::next(ArgIt)->is(tok::l_paren)) ArgIt = getMatchingRParen(++ArgIt, ArgEnd); } continue; @@ -990,8 +998,16 @@ return { MacroName, MI, {} }; RawLexer.LexFromRawLexer(TheTok); - assert(TheTok.is(tok::l_paren) && - "The token after the macro's identifier token should be '('!"); + // 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, {} }; MacroArgMap Args;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits