diff --git a/clang/lib/StaticAnalyzer/Checkers/ReturnPointerRangeChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/ReturnPointerRangeChecker.cpp --- a/clang/lib/StaticAnalyzer/Checkers/ReturnPointerRangeChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/ReturnPointerRangeChecker.cpp @@ -41,6 +41,13 @@ if (!RetE) return; + // Skip calls to built-in functions because such functions might feature + // a return statement with no valid source location. + if (const CallExpr *CE = + dyn_cast_or_null(C.getStackFrame()->getCallSite()); + CE && CE->getBuiltinCallee() != 0) + return; + SVal V = C.getSVal(RetE); const MemRegion *R = V.getAsRegion(); diff --git a/clang/test/Analysis/return-ptr-range.cpp b/clang/test/Analysis/return-ptr-range.cpp --- a/clang/test/Analysis/return-ptr-range.cpp +++ b/clang/test/Analysis/return-ptr-range.cpp @@ -115,3 +115,14 @@ } +namespace std { +// A builtin function with the body generated on the fly. +template T&& move(T &&) noexcept; +} // namespace std + +char buf[2]; + +void top() { + // see https://github.com/llvm/llvm-project/issues/55347 + (void)std::move(*(buf + 3)); // no-crash +}