Skip to content

Commit

Permalink
[analyzer] Fix infinite recursion in printing macros
Browse files Browse the repository at this point in the history
#define f(y) x
#define x f(x)
int main() { x; }

This example results a compilation error since "x" in the first line was not
defined earlier. However, the macro expression printer goes to an infinite
recursion on this example.

Patch by Tibor Brunner!

Differential Revision: https://reviews.llvm.org/D57892

llvm-svn: 354806
  • Loading branch information
Szelethus committed Feb 25, 2019
1 parent 310b75e commit cd8c438
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
Expand Up @@ -842,6 +842,9 @@ static std::string getMacroNameAndPrintExpansion(TokenPrinter &Printer,

MacroNameAndArgs Info = getMacroNameAndArgs(SM.getExpansionLoc(MacroLoc), PP);

if (!Info.MI)
return Info.Name;

// Manually expand its arguments from the previous macro.
Info.Args.expandFromPrevMacro(PrevArgs);

Expand Down Expand Up @@ -936,7 +939,14 @@ static MacroNameAndArgs getMacroNameAndArgs(SourceLocation ExpanLoc,
assert(II && "Failed to acquire the IndetifierInfo for the macro!");

const MacroInfo *MI = getMacroInfoForLocation(PP, SM, II, ExpanLoc);
assert(MI && "The macro must've been defined at it's expansion location!");
// assert(MI && "The macro must've been defined at it's expansion location!");
//
// We should always be able to obtain the MacroInfo in a given TU, but if
// we're running the analyzer with CTU, the Preprocessor won't contain the
// directive history (or anything for that matter) from another TU.
// TODO: assert when we're not running with CTU.
if (!MI)
return { MacroName, MI, {} };

// Acquire the macro's arguments.
//
Expand Down

0 comments on commit cd8c438

Please sign in to comment.