[clang] [-Wunsafe-buffer-usage] Add FixableGadget for AddAssign in UnspecifiedUntypedContext (PR #71862)
Artem Dergachev via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 14 19:20:50 PST 2023
================
@@ -1312,21 +1353,29 @@ PointerInitGadget::getFixits(const Strategy &S) const {
return std::nullopt;
}
+static bool isNonNegativeIntegerExpr(const Expr *Expr, const VarDecl *VD,
+ const ASTContext &Ctx) {
+ if (auto ConstVal = Expr->getIntegerConstantExpr(Ctx)) {
+ if (ConstVal->isNegative())
+ return false;
+ } else if (!Expr->getType()->isUnsignedIntegerType())
+ return false;
+ return true;
+}
+
std::optional<FixItList>
ULCArraySubscriptGadget::getFixits(const Strategy &S) const {
if (const auto *DRE =
dyn_cast<DeclRefExpr>(Node->getBase()->IgnoreImpCasts()))
if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
switch (S.lookup(VD)) {
case Strategy::Kind::Span: {
+
// If the index has a negative constant value, we give up as no valid
// fix-it can be generated:
const ASTContext &Ctx = // FIXME: we need ASTContext to be passed in!
VD->getASTContext();
- if (auto ConstVal = Node->getIdx()->getIntegerConstantExpr(Ctx)) {
- if (ConstVal->isNegative())
- return std::nullopt;
- } else if (!Node->getIdx()->getType()->isUnsignedIntegerType())
+ if (!isNonNegativeIntegerExpr(Node->getIdx(), VD, Ctx))
----------------
haoNoQ wrote:
I'm starting to like how these checks live in `getFixits()`, as opposed to the matcher. It's not like we'll ever be able to fix the signed case, but this way they'll show up in debug statistics as "gadget refused to produce a fix", which is better than the generic "it never matched". We could even make a dedicated debug message for this failure specifically!
https://github.com/llvm/llvm-project/pull/71862
More information about the cfe-commits
mailing list