https://github.com/shenjunjiekoda created https://github.com/llvm/llvm-project/pull/87787
## Summary Static analysis for container models with pointer iterators lacked proper support, failing to detect invalidated iterator access in cases involving `PointerType`s. This change enhanced static analysis by adding support for `PointerType` in container models, ensuring accurate detection of invalidated iterator accesses. ## Changes Updated `getCXXRecordDecl` to recognize `PointerType`, complementing existing `ReferenceType` handling. This enables precise modeling across containers using pointer iterators, improving the identification of iterator invalidation. ## Test Case Added `invalidated_access_via_end_iterator_after_push_back` to illustrate how the update catches previously undetected invalidated iterator accesses, preventing potential bugs. For this testcase , `auto Type = TI.getType();` in function `getCXXRecordDecl` would dump like this: ``` PointerType 0x561a9d57e260 'cont_with_ptr_iterator<int> *' `-ElaboratedType 0x561a9d57c530 'cont_with_ptr_iterator<int>' sugar `-TemplateSpecializationType 0x561a9d57c4e0 'cont_with_ptr_iterator<int>' sugar cont_with_ptr_iterator |-TemplateArgument type 'int' | `-BuiltinType 0x561a9d45a8b0 'int' `-RecordType 0x561a9d57c4c0 'struct cont_with_ptr_iterator<int>' `-ClassTemplateSpecialization 0x561a9d57c3e8 'cont_with_ptr_iterator' ``` ## Impact This targeted update focuses on refining `getCXXRecordDecl`. Review for any wider implications on static analysis is advisable. ## Request for Feedback Feedback on this approach, additional test scenarios, or compatibility concerns is highly appreciated to ensure a robust enhancement. Thanks for considering this contribution aimed at bolstering static analysis capabilities. >From 2f82a7c0f627fc594ed7cd9b92b464856a364cec Mon Sep 17 00:00:00 2001 From: Shenjunjie <shenjunjiek...@foxmail.com> Date: Fri, 5 Apr 2024 10:35:03 -0400 Subject: [PATCH] [clang][analyzer] Support `PointerType` in `getCXXRecordDecl` for `ContainerModeling`. Previously, `getCXXRecordDecl` did not account for `PointerType` cases, which limited its ability to model containers that use pointers rather than references. This change was necessary for accurately modeling `cont_with_ptr_iterator<int>` and similar containers, ensuring static analysis can correctly flag potential iterator invalidation issues, as demonstrated in the added test case. --- .../lib/StaticAnalyzer/Checkers/ContainerModeling.cpp | 4 ++++ clang/test/Analysis/invalidated-iterator.cpp | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp b/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp index 65a2ec4076fdf6..009c0d3fb93686 100644 --- a/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp @@ -770,6 +770,10 @@ const CXXRecordDecl *getCXXRecordDecl(ProgramStateRef State, Type = RefT->getPointeeType(); } + if (const auto *PtrT = Type->getAs<PointerType>()) { + Type = PtrT->getPointeeType(); + } + return Type->getUnqualifiedDesugaredType()->getAsCXXRecordDecl(); } diff --git a/clang/test/Analysis/invalidated-iterator.cpp b/clang/test/Analysis/invalidated-iterator.cpp index 778a8e01d99380..c940dbf7276d34 100644 --- a/clang/test/Analysis/invalidated-iterator.cpp +++ b/clang/test/Analysis/invalidated-iterator.cpp @@ -130,6 +130,14 @@ struct cont_with_ptr_iterator { T* erase(T*); }; +void invalidated_access_via_end_iterator_after_push_back() { + cont_with_ptr_iterator<int> C; + C.push_back(1); + auto i = C.end(); + C.push_back(2); + auto j = i[-1]; // expected-warning{{Invalidated iterator accessed}} +} + void invalidated_dereference_end_ptr_iterator(cont_with_ptr_iterator<int> &C) { auto i = C.begin(); C.erase(i); @@ -196,4 +204,4 @@ void invalidated_subscript_end_ptr_iterator(cont_with_ptr_iterator<int> &C) { auto i = C.begin(); C.erase(i); (void) i[1]; // expected-warning{{Invalidated iterator accessed}} -} +} \ No newline at end of file _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits