danix800 added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Core/DynamicExtent.cpp:92
+
+  return ElementCount.castAs<DefinedOrUnknownSVal>();
+}
----------------
donat.nagy wrote:
> Are you sure that this cannot cause crashes? (E.g. did you check that there 
> is no corner case when `getElementExtent` returns 0?)
> 
> I can accept this cast, especially if you have a clear proof that it's valid, 
> but I'd prefer a more defensive solution that turns `UndefinedVal` into 
> `UnknownVal` either here or preferably in the `assert()` function family that 
> consumes the results from functions like this. 
Wow~ Yeah! This really is a bug with zero-sized types, the original 
`getDynamicElementCount` suffers from this too!
Verified on 13.0.1 & main.

```
void clang_analyzer_dumpElementCount(const void *);

int a[1][0];

void var_simple_ref() {
  clang_analyzer_dumpElementCount(a); // expected-warning {{1 S64b}}
}
```

Dividing by zero gives undefined, casts failed:
```
clang: 
/home/danis/Sources/llvm-project-main/llvm/include/llvm/Support/Casting.h:566: 
decltype(auto) llvm::cast(const From &) [To = 
clang::ento::DefinedOrUnknownSVal, From = clang::ento::SVal]: Assertion 
`isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
```

`getDynamicElementCountWithOffset` is the extended offset version of 
`getDynamicElementCount`, same issue.

Nice catch!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D158707/new/

https://reviews.llvm.org/D158707

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to