Author: Zequan Wu Date: 2026-03-26T14:50:28-07:00 New Revision: e830d88e8ae5f44a97cc76136a0a4e83aa9157c0
URL: https://github.com/llvm/llvm-project/commit/e830d88e8ae5f44a97cc76136a0a4e83aa9157c0 DIFF: https://github.com/llvm/llvm-project/commit/e830d88e8ae5f44a97cc76136a0a4e83aa9157c0.diff LOG: [UnsafeBufferUsage] Check for uninstantiated default arguments to prevent crash. (#188817) Fix a crash introduced by https://github.com/llvm/llvm-project/pull/184899 The -Wunsafe-buffer-usage analysis was crashing when it encountered a template function with a default argument that hadn't been instantiated yet. This occurred in populateStmtsForFindingGadgets when it attempted to access the default argument of each parameter. This fix adds a check to ensure the default argument is instantiated before attempting to access it. Assisted-by: Gemini Added: clang/test/SemaCXX/warn-unsafe-buffer-usage-default-arg-uninstantiated-crash.cpp Modified: clang/lib/Analysis/UnsafeBufferUsage.cpp Removed: ################################################################################ diff --git a/clang/lib/Analysis/UnsafeBufferUsage.cpp b/clang/lib/Analysis/UnsafeBufferUsage.cpp index 5a9241acbee36..c44a42dc93c13 100644 --- a/clang/lib/Analysis/UnsafeBufferUsage.cpp +++ b/clang/lib/Analysis/UnsafeBufferUsage.cpp @@ -2960,7 +2960,8 @@ static void populateStmtsForFindingGadgets(SmallVector<const Stmt *> &Stmts, if (const auto *FD = dyn_cast<FunctionDecl>(D)) { AddStmt(FD->getBody()); for (const auto *PD : FD->parameters()) - AddStmt(PD->getDefaultArg()); + if (PD->hasDefaultArg() && !PD->hasUninstantiatedDefaultArg()) + AddStmt(PD->getDefaultArg()); if (const auto *CtorD = dyn_cast<CXXConstructorDecl>(FD)) llvm::append_range( Stmts, llvm::map_range(CtorD->inits(), diff --git a/clang/test/SemaCXX/warn-unsafe-buffer-usage-default-arg-uninstantiated-crash.cpp b/clang/test/SemaCXX/warn-unsafe-buffer-usage-default-arg-uninstantiated-crash.cpp new file mode 100644 index 0000000000000..03bf427869484 --- /dev/null +++ b/clang/test/SemaCXX/warn-unsafe-buffer-usage-default-arg-uninstantiated-crash.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -Wunsafe-buffer-usage -std=c++23 %s -verify + +// expected-no-diagnostics + +template <class _CharT> struct basic_string { + struct __rep { + __rep(int); + }; + basic_string(_CharT, __rep = int()) {} +}; +char16_t operators___str; +decltype(sizeof(int)) operators___len; +void operators() { basic_string(operators___str, operators___len); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
