[clang] [Wunsafe-buffer-usage] False positives for & expression indexing constant size array (arr[anything & 0]) (PR #112284)
Ziqing Luo via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 5 12:17:00 PST 2025
================
@@ -431,6 +431,122 @@ AST_MATCHER(CXXConstructExpr, isSafeSpanTwoParamConstruct) {
return false;
}
+class MaxValueEval : public ConstStmtVisitor<MaxValueEval, llvm::APInt> {
+
+ ASTContext &Context;
+ llvm::APInt Max;
+ unsigned bit_width;
+
+public:
+ typedef ConstStmtVisitor<MaxValueEval, llvm::APInt> VisitorBase;
+
+ explicit MaxValueEval(ASTContext &Ctx, const Expr *exp) : Context(Ctx) {
+ bit_width = Ctx.getIntWidth(exp->getType());
+ Max = llvm::APInt::getSignedMaxValue(bit_width);
+ // val.clear();
+ }
+
+ llvm::APInt findMatch(Expr *exp) { return TraverseStmt(exp); }
+
+ llvm::APInt TraverseStmt(Stmt *S) {
+ if (Expr *E = dyn_cast<Expr>(S)) {
+ Expr::EvalResult EVResult;
+ if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
----------------
ziqingluo-90 wrote:
nit: we could do a `switch` on `E->getStmtClass()` here, which is more efficient than a list of if-else.
https://github.com/llvm/llvm-project/pull/112284
More information about the cfe-commits
mailing list