Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
7e5bfbf
[CHERI-CSA] Allow ASTContext::getIntWidth() for reference type
eupharina Dec 14, 2022
23924f4
[CHERI-CSA] Improve LocAsInt arithmetic support
eupharina Dec 21, 2022
179c6d5
[CHERI-CSA] Add provenance bit to LocAsInteger
eupharina Dec 22, 2022
e377793
[analyzer] scan-build: Retain -nostdinc++ option
eupharina Jan 9, 2023
4fa6835
[CHERI-CSA] Add alpha.cheri.ProvenanceSourceChecker
eupharina Dec 21, 2022
478f68e
[CHERI-CSA] ProvenanceSourceChecker: add subtraction
eupharina Feb 8, 2023
21c022e
[CHERI-CSA] Add CapabilityCopyChecker
eupharina Feb 16, 2023
84c4638
[CHERI_CSA] CapabilityCopyChecker: suppress for short loops
eupharina Mar 13, 2023
67344f4
[CHERI_CSA] CapabilityCopyChecker: suppress for unaligned ptr
eupharina Mar 15, 2023
85c6690
[CHERI_CSA] CapabilityCopyChecker: silence for hybrid mode
eupharina Jun 22, 2023
224e5b4
[CHERI-CSA] CapabilityCopyChecker: char* as universal pointer
eupharina Jun 27, 2023
b91445a
[CHERI-CSA] CapabilityCopyChecker: suppress FP for short copies
eupharina Jul 14, 2023
2fa476b
[CHERI-CSA] CapabilityCopyChecker: improve bug trace
eupharina Jul 14, 2023
2574a3d
[CHERI_CSA] ProvenanceSourceChecker: silence for hybrid mode
eupharina Jul 24, 2023
de17776
[CHERI_CSA] CHERIUtils
eupharina Jul 26, 2023
d63a8bf
[CHERI_CSA] Add Capability Alignment Checker
eupharina Jul 26, 2023
6bf41e4
[CHERI_CSA] CapabilityAlignmentChecker: assume align on parameters an…
eupharina Aug 4, 2023
e4cdb03
[CHERI_CSA] CapabilityAlignmentChecker: support align check
eupharina Aug 8, 2023
5e7b671
[CHERI_CSA] CapabilityAlignmentChecker: array element alignment
eupharina Aug 9, 2023
83ed0f3
[CHERI_CSA] CapabilityAlignmentChecker: attribute __aligned__
eupharina Aug 10, 2023
ac89c53
[CHERI_CSA] CapabilityAlignmentChecker: BugReporterVisitor
eupharina Aug 14, 2023
3988e97
[CHERI_CSA] CapabilityAlignmentChecker: fix FP for comparison with void*
eupharina Aug 15, 2023
35eb148
[CHERI_CSA] CapabilityAlignmentChecker: refactoring of MemRegion alig…
eupharina Aug 17, 2023
b454a80
[CHERI_CSA] CapabilityAlignmentChecker: add allocation source locatio…
eupharina Aug 17, 2023
867460b
[CHERI_CSA] CapabilityAlignmentChecker: improve warning message
eupharina Aug 18, 2023
43da07c
[CHERI_CSA] CapabilityAlignmentChecker: removing dead symbols
eupharina Aug 22, 2023
b514fd0
[CHERI_CSA] move 3 checkers from CHERIAlpha to CHERI section
eupharina Sep 6, 2023
2c99c72
[CHERI_CSA] ProvenanceSourceChecker: propagate InvalidCap through Una…
eupharina Sep 7, 2023
b4f52a7
[CHERI_CSA] Enable cheri.* checkers by default on purecap
eupharina Sep 8, 2023
25f8445
[CHERI_CSA] ProvenanceSourceChecker: add FixIts
eupharina Sep 8, 2023
84ed599
[CHERI_CSA] Move cheri.CapabilityAlignmentChecker -> optin.portabilit…
eupharina Sep 11, 2023
14fd573
[CHERI_CSA] CapabilityCopyChecker: add ReportForCharPtr option
eupharina Sep 14, 2023
33d92d1
[CHERI_CSA] Enable alpha.core.PointerSub by default for CHERI
eupharina Sep 15, 2023
b769f3e
[CHERI_CSA] Support non-constant offsets to ElementRegion
eupharina Sep 27, 2023
97c4488
[CHERI_CSA] PointerAlignmentChecker: improve alignment tracking
eupharina Sep 27, 2023
9b463af
[CHERI_CSA] PointerAlignmentChecker: use declaration as uniquing loca…
eupharina Oct 10, 2023
4d7d876
[CHERI_CSA] CapabilityCopyChecker: fix infinite recursion
eupharina Nov 1, 2023
85d41ef
[CHERI_CSA] PointerSizeAssumptionsChecker: new checker
eupharina Oct 20, 2023
744a971
[CHERI_CSA] ProvenanceSourceChecker: divide bugs into subtypes
eupharina Nov 13, 2023
69f2bbd
[CHERI_CSA] ProvenanceSource: suppress with -Wno-cheri-provenance
eupharina Nov 15, 2023
372660f
[CHERI_CSA] Fix note links in reports HTML
eupharina Feb 12, 2024
9b90691
[CHERI_CSA] Fix crash with FieldDecl as UniqLoc
eupharina Nov 28, 2023
108b275
[CHERI_CSA] PointerAlignmentChecker: report implicit assignment amd m…
eupharina Nov 27, 2023
42e2ef6
[CHERI_CSA] PointerAlignmentChecker: fix FP for adjacent objects
eupharina Dec 8, 2023
8da4deb
[CHERI_CSA] PointerAlignmentChecker: fix FP for void* assignment
eupharina Feb 2, 2024
db0d1fa
[CHERI_CSA] PointerAlignmentChecker: improve warning notes
eupharina Feb 5, 2024
3c116cb
[CHERI_CSA] PointerAlignmentChecker: suppress duplicate reports
eupharina Feb 6, 2024
96fe9ce
[CHERI_CSA] PointerAlignmentChecker: improve messages & traces
eupharina Feb 9, 2024
a675e41
[CHERI_CSA] PointerAlignmentChecker: rework handling symbolic addresses
eupharina Feb 9, 2024
35717dc
[CHERI_CSA] PointerAlignmentChecker: false warnings suppression
eupharina Feb 23, 2024
144729f
[CHERI_CSA] CapabilityCopyChecker: ReportForCharPtr=false by default
eupharina Mar 20, 2024
5c663af
[CHERI_CSA] PointerAlignmentChecker: refine warning types
eupharina Mar 26, 2024
a6f4db9
[CHERI_CSA] ProvenanceSourceChecker: refine warning types
eupharina Mar 26, 2024
f2b39c8
[CHERI_CSA] PointerAlignmentChecker: support bcopy
eupharina Mar 26, 2024
509fe41
[CHERI_CSA] ProvenanceSourceChecker: delete ptrdiff as capability war…
eupharina Mar 27, 2024
7e5aa23
[CHERI_CSA] ProvenanceSourceChecker: Fix for CompoundAssignmentOp
eupharina Apr 2, 2024
e93c669
[CHERI_CSA] CapabilityCopyChecker: fix for BugType
eupharina Apr 4, 2024
8454c18
[CHERI_CSA] ProvenanceSourceChecker: refine warning types
eupharina May 28, 2024
cb452eb
[CHERI_CSA] New alpha.cheri.SubObjectRepresentability checker
eupharina Apr 22, 2024
fdf3f22
[CHERI_CSA] SubObjectRepresentability: detailed message
eupharina Apr 24, 2024
6277778
[CHERI_CSA] SubObjectRepresentability: disable notes for now
eupharina Apr 25, 2024
831b9e4
[CHERI_CSA] SubObjectRepresentability: enable notes with updated cher…
eupharina May 6, 2024
d7f052a
[CHERI_CSA] SubObjectRepresentability: move alpha.cheri -> cheri
eupharina May 7, 2024
94fbd8a
[CHERI_CSA] New cheri.Allocation checker
eupharina Mar 29, 2024
d1643ed
[CHERI_CSA] AllocationChecker: move static and heap allocation to new…
eupharina Apr 18, 2024
eeea1ee
[CHERI_CSA] AllocationChecker: suppress for ptr to first field
eupharina Apr 18, 2024
83bdcd5
[CHERI_CSA] CHERIUtils: Print aka type in messages
eupharina May 28, 2024
147f56c
[CHERI_CSA] AllocationChecker: suppress for flexible array
eupharina May 6, 2024
bb30d27
[CHERI_CSA] AllocationChecker: rework
eupharina May 20, 2024
8e7a103
[CHERI_CSA] AllocationChecker: suppress for free
eupharina May 23, 2024
2f8a9b1
[CHERI_CSA] CHERI API Modelling
eupharina May 24, 2024
54b08f4
[CHERI_CSA] AllocationChecker: suppress for bounded suballocations
eupharina May 24, 2024
1188df4
[CHERI_CSA] AllocationChecker: add ReportForUnknownAllocations option
eupharina May 24, 2024
389ce92
[CHERI_CSA] AllocationChecker: disable for non-purecap
eupharina May 31, 2024
75819ee
[CHERI_CSA] Refactoring state cleanup for dead symbols & regions
eupharina May 31, 2024
ccec300
[CHERI_CSA] SubObjectRepresentability: support other CHERI targets
eupharina Jun 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ def FuchsiaAlpha : Package<"fuchsia">, ParentPackage<Alpha>;
def WebKit : Package<"webkit">;
def WebKitAlpha : Package<"webkit">, ParentPackage<Alpha>;

def CHERI : Package<"cheri">;
def CHERIAlpha : Package<"cheri">, ParentPackage<Alpha>;

//===----------------------------------------------------------------------===//
// Core Checkers.
//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1671,6 +1674,10 @@ def UnixAPIPortabilityChecker : Checker<"UnixAPI">,
HelpText<"Finds implementation-defined behavior in UNIX/Posix functions">,
Documentation<NotDocumented>;

def PointerAlignmentChecker : Checker<"PointerAlignment">,
HelpText<"Check underaligned pointers.">,
Documentation<NotDocumented>;

} // end optin.portability


Expand Down Expand Up @@ -1780,3 +1787,66 @@ def UncheckedLocalVarsChecker : Checker<"UncheckedLocalVarsChecker">,
Documentation<HasDocumentation>;

} // end alpha.webkit

//===----------------------------------------------------------------------===//
// CHERI checkers.
//===----------------------------------------------------------------------===//

let ParentPackage = CHERI in {

def CheriAPIModelling : Checker<"CheriAPIModelling">,
HelpText<"Model CheriAPI">,
Documentation<NotDocumented>;

def ProvenanceSourceChecker
: Checker<"ProvenanceSource">,
HelpText<"Check expressions with ambiguous provenance source.">,
CheckerOptions<
[CmdLineOption<Boolean, "ShowFixIts",
"Enable fix-it hints for this checker", "false",
InAlpha>,
CmdLineOption<
Boolean, "ReportForAmbiguousProvenance",
"Report for binary operations with ambiguous provenance "
"for which the default capability derivation from LHS is "
"fine. "
"Disabled if [-Wcheri-provenance] is disabled.",
"true", Released>]>,
Documentation<NotDocumented>;

def CapabilityCopyChecker
: Checker<"CapabilityCopy">,
HelpText<"Check tag-stripping memory copy.">,
CheckerOptions<[CmdLineOption<
Boolean, "ReportForCharPtr",
"Report tag-stripping copy for char* function parameters. "
"Suppression of warnings for C-strings is used to reduce "
"the number of false alarms, but it's not very reliable.",
"false", Released>]>,
Documentation<NotDocumented>;

def PointerSizeAssumptionsChecker
: Checker<"PointerSizeAssumptions">,
HelpText<"Detect hardcoded expectations on pointer sizes">,
Documentation<NotDocumented>;

def SubObjectRepresentabilityChecker
: Checker<"SubObjectRepresentability">,
HelpText<
"Check for record fields with unrepresentable subobject bounds">,
Documentation<NotDocumented>;

} // end cheri

let ParentPackage = CHERIAlpha in {

def AllocationChecker
: Checker<"Allocation">,
HelpText<
"Suggest narrowing bounds for escaping suballocation capabilities">,
CheckerOptions<[CmdLineOption<
Boolean, "ReportForUnknownAllocations",
"Report for pointers with untracked origin", "true", Released>]>,
Documentation<NotDocumented>;

} // end alpha.cheri
Original file line number Diff line number Diff line change
Expand Up @@ -776,9 +776,11 @@ inline SVal ProgramState::getLValue(const ObjCIvarDecl *D, SVal Base) const {
return getStateManager().StoreMgr->getLValueIvar(D, Base);
}

inline SVal ProgramState::getLValue(QualType ElementType, SVal Idx, SVal Base) const{
inline SVal ProgramState::getLValue(QualType ElementType, SVal Idx,
SVal Base) const {
if (std::optional<NonLoc> N = Idx.getAs<NonLoc>())
return getStateManager().StoreMgr->getLValueElement(ElementType, *N, Base);
return getStateManager().StoreMgr->getLValueElement(this, ElementType, *N,
Base);
return UnknownVal();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,10 @@ class SValBuilder {
return nonloc::ConcreteInt(BasicVals.getValue(integer, ptrType));
}

NonLoc makeLocAsInteger(Loc loc, unsigned bits) {
NonLoc makeLocAsInteger(Loc loc, unsigned bits, bool hasProvenance) {
assert((bits & ~255) == 0);
if (hasProvenance)
bits |= 256;
return nonloc::LocAsInteger(BasicVals.getPersistentSValWithData(loc, bits));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,13 @@ class LocAsInteger : public NonLoc {
}

unsigned getNumBits() const {
return castDataAs<std::pair<SVal, uintptr_t>>()->second;
return castDataAs<std::pair<SVal, uintptr_t>>()->second & 255;
}

bool hasProvenance() const {
const std::pair<SVal, uintptr_t> *D =
castDataAs<std::pair<SVal, uintptr_t>>();
return D->second & 256;
}

static bool classof(SVal V) { return V.getKind() == LocAsIntegerKind; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ class StoreManager {
return getLValueFieldOrIvar(D, Base);
}

virtual SVal getLValueElement(QualType elementType, NonLoc offset, SVal Base);
virtual SVal getLValueElement(ProgramStateRef State, QualType elementType,
NonLoc offset, SVal Base);

/// ArrayToPointer - Used by ExprEngine::VistCast to handle implicit
/// conversions between arrays and pointers.
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/AST/ASTContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12112,6 +12112,9 @@ unsigned ASTContext::getIntWidth(QualType T) const {
if (Target->SupportsCapabilities()) {
if (T->isPointerType() && T->getAs<PointerType>()->isCHERICapability())
return Target->getPointerRangeForCHERICapability();
if (T->isReferenceType() && T->getAs<ReferenceType>()->isCHERICapability()) {
return Target->getPointerRangeForCHERICapability();
}
if (T->isIntCapType())
return Target->getPointerRangeForCHERICapability();
// This assertion is correct but breaks some static analyser code paths
Expand Down
26 changes: 24 additions & 2 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
#include "llvm/TargetParser/RISCVISAInfo.h"
#include "llvm/TargetParser/RISCVTargetParser.h"
#include <cctype>
#include <clang/Basic/DiagnosticSema.h>

using namespace clang::driver;
using namespace clang::driver::tools;
Expand Down Expand Up @@ -3570,7 +3571,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,

static void RenderAnalyzerOptions(const ArgList &Args, ArgStringList &CmdArgs,
const llvm::Triple &Triple,
const InputInfo &Input) {
const InputInfo &Input,
DiagnosticsEngine &Diags) {
// Add default argument set.
if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
CmdArgs.push_back("-analyzer-checker=core");
Expand Down Expand Up @@ -3616,6 +3618,26 @@ static void RenderAnalyzerOptions(const ArgList &Args, ArgStringList &CmdArgs,
CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
}

if (Triple.getEnvironment() == llvm::Triple::CheriPurecap ||
// FIXME: checks below should eventually become unreachable when
// Triple is updated to purecap in ToolChain constructor
(Triple.isMIPS() && tools::mips::hasMipsAbiArg(Args, "purecap")) ||
(Triple.isRISCV() && tools::riscv::isCheriPurecap(Args, Triple))) {
CmdArgs.push_back("-analyzer-checker=cheri");

// disable AmbiguousProvenance war if [-Wcheri-provenance] is disabled
if (Diags.getDiagnosticLevel(
diag::warn_ambiguous_provenance_capability_binop,
SourceLocation()) < DiagnosticsEngine::Warning) {
CmdArgs.push_back("-analyzer-config");
CmdArgs.push_back(
"cheri.ProvenanceSource:ReportForAmbiguousProvenance=false");
}

CmdArgs.push_back("-analyzer-checker=optin.portability.PointerAlignment");
CmdArgs.push_back("-analyzer-checker=alpha.core.PointerSub");
}

// Default nullability checks.
CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
CmdArgs.push_back("-analyzer-checker=nullability.NullReturnedFromNonnull");
Expand Down Expand Up @@ -5705,7 +5727,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-DUNICODE");

if (isa<AnalyzeJobAction>(JA))
RenderAnalyzerOptions(Args, CmdArgs, Triple, Input);
RenderAnalyzerOptions(Args, CmdArgs, Triple, Input, D.getDiags());

if (isa<AnalyzeJobAction>(JA) ||
(isa<PreprocessJobAction>(JA) && Args.hasArg(options::OPT__analyze)))
Expand Down
Loading