forked from GPUOpen-Drivers/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merged master:e9f943429c8 into amd-gfx:f8416c3e42a
Local branch amd-gfx f8416c3 Merged master:edc7da24057 into amd-gfx:5925a948df2 Remote branch master e9f9434 [lldb] Skip TestIOHandlerResizeNoEditline on Windows
- Loading branch information
Showing
51 changed files
with
1,364 additions
and
374 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
//=== SmartPtr.h - Tracking smart pointer state. -------------------*- C++ -*-// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Defines inter-checker API for the smart pointer modeling. It allows | ||
// dependent checkers to figure out if an smart pointer is null or not. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_SMARTPTR_H | ||
#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_SMARTPTR_H | ||
|
||
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" | ||
|
||
namespace clang { | ||
namespace ento { | ||
namespace smartptr { | ||
|
||
/// Set of STL smart pointer class which we are trying to model. | ||
const llvm::StringSet<> StdSmartPtrs = { | ||
"shared_ptr", | ||
"unique_ptr", | ||
"weak_ptr", | ||
}; | ||
|
||
/// Returns true if the event call is on smart pointer. | ||
bool isStdSmartPtrCall(const CallEvent &Call); | ||
|
||
/// Returns whether the smart pointer is null or not. | ||
bool isNullSmartPtr(const ProgramStateRef State, const MemRegion *ThisRegion); | ||
|
||
} // namespace smartptr | ||
} // namespace ento | ||
} // namespace clang | ||
|
||
#endif // LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_SMARTPTR_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
// SmartPtrChecker.cpp - Check for smart pointer dereference - C++ --------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines a checker that check for null dereference of C++ smart | ||
// pointer. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
#include "SmartPtr.h" | ||
|
||
#include "clang/AST/DeclCXX.h" | ||
#include "clang/AST/ExprCXX.h" | ||
#include "clang/AST/Type.h" | ||
#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" | ||
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" | ||
#include "clang/StaticAnalyzer/Core/Checker.h" | ||
#include "clang/StaticAnalyzer/Core/CheckerManager.h" | ||
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" | ||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" | ||
#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h" | ||
#include "clang/StaticAnalyzer/Core/PathSensitive/SymExpr.h" | ||
|
||
using namespace clang; | ||
using namespace ento; | ||
|
||
namespace { | ||
class SmartPtrChecker : public Checker<check::PreCall> { | ||
BugType NullDereferenceBugType{this, "Null SmartPtr dereference", | ||
"C++ Smart Pointer"}; | ||
|
||
public: | ||
void checkPreCall(const CallEvent &Call, CheckerContext &C) const; | ||
|
||
private: | ||
void reportBug(CheckerContext &C, const CallEvent &Call) const; | ||
}; | ||
} // end of anonymous namespace | ||
|
||
void SmartPtrChecker::checkPreCall(const CallEvent &Call, | ||
CheckerContext &C) const { | ||
if (!smartptr::isStdSmartPtrCall(Call)) | ||
return; | ||
ProgramStateRef State = C.getState(); | ||
const auto *OC = dyn_cast<CXXMemberOperatorCall>(&Call); | ||
if (!OC) | ||
return; | ||
const MemRegion *ThisRegion = OC->getCXXThisVal().getAsRegion(); | ||
if (!ThisRegion) | ||
return; | ||
|
||
OverloadedOperatorKind OOK = OC->getOverloadedOperator(); | ||
if (OOK == OO_Star || OOK == OO_Arrow) { | ||
if (smartptr::isNullSmartPtr(State, ThisRegion)) | ||
reportBug(C, Call); | ||
} | ||
} | ||
|
||
void SmartPtrChecker::reportBug(CheckerContext &C, | ||
const CallEvent &Call) const { | ||
ExplodedNode *ErrNode = C.generateErrorNode(); | ||
if (!ErrNode) | ||
return; | ||
|
||
auto R = std::make_unique<PathSensitiveBugReport>( | ||
NullDereferenceBugType, "Dereference of null smart pointer", ErrNode); | ||
C.emitReport(std::move(R)); | ||
} | ||
|
||
void ento::registerSmartPtrChecker(CheckerManager &Mgr) { | ||
Mgr.registerChecker<SmartPtrChecker>(); | ||
} | ||
|
||
bool ento::shouldRegisterSmartPtrChecker(const CheckerManager &mgr) { | ||
const LangOptions &LO = mgr.getLangOpts(); | ||
return LO.CPlusPlus; | ||
} |
Oops, something went wrong.