Author: Ryosuke Niwa Date: 2025-06-06T07:49:38-06:00 New Revision: 7809b147fa52ca4afd5e1aebd1c5cc7559b820c5
URL: https://github.com/llvm/llvm-project/commit/7809b147fa52ca4afd5e1aebd1c5cc7559b820c5 DIFF: https://github.com/llvm/llvm-project/commit/7809b147fa52ca4afd5e1aebd1c5cc7559b820c5.diff LOG: [alpha.webkit.UncheckedCallArgsChecker] Forwarding r-value reference should not result in a warning (#142471) This PR fixes the bug that the checker emits a warning when a function takes T&& and passes it to another function using std::move. We should treat std::move like any other pointer conversion and the origin of the pointer to be that of the argument. Added: Modified: clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp index f087fc8fa19fd..81fca5d719b4d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp @@ -119,6 +119,11 @@ bool tryToFindPtrOrigin( } } + if (call->isCallToStdMove() && call->getNumArgs() == 1) { + E = call->getArg(0)->IgnoreParenCasts(); + continue; + } + if (auto *callee = call->getDirectCallee()) { if (isCtorOfSafePtr(callee)) { if (StopAtFirstRefCountedObj) diff --git a/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp b/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp index e24b04dcd3cf9..c938ba5f7de46 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args-checked.cpp @@ -2,6 +2,20 @@ #include "mock-types.h" +namespace std { + +template <typename T> struct remove_reference { + typedef T type; +}; + +template <typename T> struct remove_reference<T&> { + typedef T type; +}; + +template<typename T> typename remove_reference<T>::type&& move(T&& t); + +} // namespace std + RefCountableAndCheckable* makeObj(); CheckedRef<RefCountableAndCheckable> makeObjChecked(); void someFunction(RefCountableAndCheckable*); @@ -54,3 +68,12 @@ void foo() { } } + +namespace call_with_std_move { + +void consume(CheckedObj&&); +void foo(CheckedObj&& obj) { + consume(std::move(obj)); +} + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits