[PATCH] D104285: [analyzer] Retrieve value by direct index from list initialization of constant array declaration.
Chris Hamilton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 18 06:39:07 PDT 2021
chrish_ericsson_atx added inline comments.
================
Comment at: clang/include/clang/AST/Expr.h:4961
+ /// - `nullptr` for invalid index (`i < 0` or `i >= array_size`).
+ const Expr *getExprForConstArrayByRawIndex(int64_t Idx) const;
+
----------------
I think in most (all?) other methods in this class, array indices are unsigned in the API. If the array index itself comes from an expression that is negative (i.e., a literal negative integer, or an constant expression that evaluates to a negative number), that has to be handled correctly, but I'm not sure this is the right place to do it. As this code stands, if an integer literal used used, which is greater than LONG_MAX, but less than ULONG_MAX, it will be end up being treated as invalid in this method, won't it?
================
Comment at: clang/lib/StaticAnalyzer/Core/RegionStore.cpp:1671
if (auto CI = R->getIndex().getAs<nonloc::ConcreteInt>()) {
int64_t i = CI->getValue().getSExtValue();
+ const Expr *E = InitList->getExprForConstArrayByRawIndex(i);
----------------
I see where you got the int64_t from -- that's what getSExtValue() returns. So, if the literal const index value in the expr is greater than LONG_MAX (but less than ULONG_MAX, of course), this would assert. That seems undesirable....
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D104285/new/
https://reviews.llvm.org/D104285
More information about the cfe-commits
mailing list