Skip to content

Commit

Permalink
[Analyzer][NFC] Change parameter of NoteTag lambdas to PathSensitiveB…
Browse files Browse the repository at this point in the history
…ugReport

Lambdas creating path notes using NoteTags still take BugReport as their
parameter. Since path notes obviously only appear in PathSensitiveBugReports
it is straightforward that lambdas of NoteTags take PathSensitiveBugReport
as their parameter.

Differential Revision: https://reviews.llvm.org/D75898
  • Loading branch information
Adam Balogh committed Mar 10, 2020
1 parent 3047719 commit 20a3d64
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 22 deletions.
Expand Up @@ -726,7 +726,8 @@ class BugReporterContext {
class NoteTag : public ProgramPointTag {
public:
using Callback =
std::function<std::string(BugReporterContext &, BugReport &)>;
std::function<std::string(BugReporterContext &,
PathSensitiveBugReport &)>;

private:
static int Kind;
Expand All @@ -743,7 +744,7 @@ class NoteTag : public ProgramPointTag {
}

Optional<std::string> generateMessage(BugReporterContext &BRC,
BugReport &R) const {
PathSensitiveBugReport &R) const {
std::string Msg = Cb(BRC, R);
if (Msg.empty())
return None;
Expand Down
Expand Up @@ -258,10 +258,12 @@ class CheckerContext {
/// @param IsPrunable Whether the note is prunable. It allows BugReporter
/// to omit the note from the report if it would make the displayed
/// bug path significantly shorter.
const NoteTag *getNoteTag(std::function<std::string(BugReport &)> &&Cb,
bool IsPrunable = false) {
const NoteTag
*getNoteTag(std::function<std::string(PathSensitiveBugReport &)> &&Cb,
bool IsPrunable = false) {
return getNoteTag(
[Cb](BugReporterContext &, BugReport &BR) { return Cb(BR); },
[Cb](BugReporterContext &,
PathSensitiveBugReport &BR) { return Cb(BR); },
IsPrunable);
}

Expand All @@ -274,7 +276,8 @@ class CheckerContext {
/// bug path significantly shorter.
const NoteTag *getNoteTag(std::function<std::string()> &&Cb,
bool IsPrunable = false) {
return getNoteTag([Cb](BugReporterContext &, BugReport &) { return Cb(); },
return getNoteTag([Cb](BugReporterContext &,
PathSensitiveBugReport &) { return Cb(); },
IsPrunable);
}

Expand All @@ -286,7 +289,8 @@ class CheckerContext {
/// bug path significantly shorter.
const NoteTag *getNoteTag(StringRef Note, bool IsPrunable = false) {
return getNoteTag(
[Note](BugReporterContext &, BugReport &) { return std::string(Note); },
[Note](BugReporterContext &,
PathSensitiveBugReport &) { return std::string(Note); },
IsPrunable);
}

Expand Down
Expand Up @@ -53,7 +53,7 @@ void CXXSelfAssignmentChecker::checkBeginFunction(CheckerContext &C) const {

ProgramStateRef SelfAssignState = State->bindLoc(Param, ThisVal, LCtx);
const NoteTag *SelfAssignTag =
C.getNoteTag([MD](BugReport &BR) -> std::string {
C.getNoteTag([MD](PathSensitiveBugReport &BR) -> std::string {
SmallString<256> Msg;
llvm::raw_svector_ostream Out(Msg);
Out << "Assuming " << MD->getParamDecl(0)->getName() << " == *this";
Expand All @@ -63,7 +63,7 @@ void CXXSelfAssignmentChecker::checkBeginFunction(CheckerContext &C) const {

ProgramStateRef NonSelfAssignState = State->bindLoc(Param, ParamVal, LCtx);
const NoteTag *NonSelfAssignTag =
C.getNoteTag([MD](BugReport &BR) -> std::string {
C.getNoteTag([MD](PathSensitiveBugReport &BR) -> std::string {
SmallString<256> Msg;
llvm::raw_svector_ostream Out(Msg);
Out << "Assuming " << MD->getParamDecl(0)->getName() << " != *this";
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/StaticAnalyzer/Checkers/FuchsiaHandleChecker.cpp
Expand Up @@ -382,8 +382,8 @@ void FuchsiaHandleChecker::checkPostCall(const CallEvent &Call,
}
const NoteTag *T = nullptr;
if (!Notes.empty()) {
T = C.getNoteTag(
[this, Notes{std::move(Notes)}](BugReport &BR) -> std::string {
T = C.getNoteTag([this, Notes{std::move(Notes)}](
PathSensitiveBugReport &BR) -> std::string {
if (&BR.getBugType() != &UseAfterReleaseBugType &&
&BR.getBugType() != &LeakBugType &&
&BR.getBugType() != &DoubleReleaseBugType)
Expand Down
19 changes: 10 additions & 9 deletions clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp
Expand Up @@ -210,15 +210,16 @@ void MIGChecker::checkPostCall(const CallEvent &Call, CheckerContext &C) const {
if (!PVD || State->contains<RefCountedParameters>(PVD))
return;

const NoteTag *T = C.getNoteTag([this, PVD](BugReport &BR) -> std::string {
if (&BR.getBugType() != &BT)
return "";
SmallString<64> Str;
llvm::raw_svector_ostream OS(Str);
OS << "Value passed through parameter '" << PVD->getName()
<< "\' is deallocated";
return std::string(OS.str());
});
const NoteTag *T =
C.getNoteTag([this, PVD](PathSensitiveBugReport &BR) -> std::string {
if (&BR.getBugType() != &BT)
return "";
SmallString<64> Str;
llvm::raw_svector_ostream OS(Str);
OS << "Value passed through parameter '" << PVD->getName()
<< "\' is deallocated";
return std::string(OS.str());
});
C.addTransition(State->set<ReleasedParameter>(true), T);
}

Expand Down
2 changes: 1 addition & 1 deletion clang/lib/StaticAnalyzer/Checkers/ReturnValueChecker.cpp
Expand Up @@ -99,7 +99,7 @@ void ReturnValueChecker::checkPostCall(const CallEvent &Call,

std::string Name = getName(Call);
const NoteTag *CallTag = C.getNoteTag(
[Name, ExpectedValue](BugReport &) -> std::string {
[Name, ExpectedValue](PathSensitiveBugReport &) -> std::string {
SmallString<128> Msg;
llvm::raw_svector_ostream Out(Msg);

Expand Down
2 changes: 1 addition & 1 deletion clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
Expand Up @@ -221,7 +221,7 @@ void CoreEngine::HandleBlockEdge(const BlockEdge &L, ExplodedNode *Pred) {
if (L.getSrc()->getTerminator().isVirtualBaseBranch() &&
L.getDst() == *L.getSrc()->succ_begin()) {
ProgramPoint P = L.withTag(getNoteTags().makeNoteTag(
[](BugReporterContext &, BugReport &) -> std::string {
[](BugReporterContext &, PathSensitiveBugReport &) -> std::string {
// TODO: Just call out the name of the most derived class
// when we know it.
return "Virtual base initialization skipped because "
Expand Down

0 comments on commit 20a3d64

Please sign in to comment.