Clang Static Analyzer - BugReporter::EmitBasicReport with Stmt

Hi,

In a Static Analyzer checker, using AST matchers, I located an IntegerLiteral that I want to report. I’m trying to do this with BugReporter::EmitBasicReport, which requires a PathDiagnosticLocation.

There is PathDiagnosticLocation::createBegin that I’ve used before with previous checkers - unfortunately, the overload that accepts an Stmt* (as an IntegerLiteral is not a Decl, but it is an Stmt) also requires a mysterious third parameter, a LocationOrAnalysisDeclContext. I tried looking through the documentation, but apparently anything that returns a LocationDeclContext or AnalysisDeclContext either require a CheckerContext (which I don’t have, because I’m in checkEndOfTranslationUnit: all I have is the TranslationUnitDecl, the AnalysisManager and the BugReporter), or a Decl*.

Any clues on how could I do this? I’m using Clang 3.2.

Note: I’m aware that the Clang Static Analyzer by default is not linked to libASTMatchers, but I solved that, that is NOT the issue here.

Thanks!

Gabor

Hi, Gábor. The LocationContext/AnalysisDeclContext is used to find an appropriate location for the statement, which may be in an enclosing expression. You need a Decl for this because we don't want to build a parent map for the entire ASTContext.

May I suggest running your matcher in checkASTCodeBody instead of checkEndOfTranslationUnit?

Jordan

Hi Jordan,

Okay, so that Decl I need to specify is the parent for the Stmt I want to report? That makes sense.
The reason I’m running my matchers in checkEndOfTranslationUnit, is because a lot of matches are not actually inside function bodies, but are for example data members of classes. I was under the impression that checkASTCodeBody would only be called for functions (although I can’t quite remember why). Is that not the case?

Thanks!

Gabor

Hm, no, you’re right there—“code body” refers to a function or method body. checkASTDecl would do every declaration, but you still can’t get an AnalysisDeclContext for globals.

I guess when all else fails you just go for the “minimal” form of a PathDiagnosticLocation: the constructor that takes a SourceLocation and a SourceManager.

Jordan