[clang] [Analyzer] No longer crash with VLA operands to unary type traits (PR #151719)
Balazs Benics via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 1 09:06:06 PDT 2025
================
@@ -0,0 +1,18 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
+// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify -x c -std=c2y %s
+// expected-no-diagnostics
+
+// Ensure that VLA types are correctly handled by unary type traits in the
+// expression engine. Previously, __datasizeof and _Countof both caused failed
+// assertions.
+void gh151711(int i) {
+ (void)sizeof(int[i++]);
+
+#ifdef __cplusplus
+ // __datasizeof is only available in C++.
+ (void)__datasizeof(int[i++]);
+#else
+ // _Countof is only available in C.
+ (void)_Countof(int[i++]);
+#endif
+}
----------------
steakhal wrote:
Could you dump the result of these expressions? I'm not convinced we do the right thing in terms of semantics.
Be sure to patch the RUN lines by replacing `core` with `core,debug.ExprInspection`.
Please report back what you get. My bet is that it's handled the same way as sizeof before, hence we get "unknown" - which is the correct result in this case.
If that would be the case, feel free to asset it with an expected warning.
```suggestion
void clang_analyzer_dump(int);
// Ensure that VLA types are correctly handled by unary type traits in the
// expression engine. Previously, __datasizeof and _Countof both caused failed
// assertions.
void gh151711(int i) {
clang_analyzer_dump(sizeof(int[i++])); // expected-warning {{Unknown}}
#ifdef __cplusplus
// __datasizeof is only available in C++.
clang_analyzer_dump(__datasizeof(int[i++]));
#else
// _Countof is only available in C.
clang_analyzer_dump(_Countof(int[i++]));
#endif
}
```
https://github.com/llvm/llvm-project/pull/151719
More information about the cfe-commits
mailing list