https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/176821
>From 4982a7a32c215d9b21c1a232e4c3d40989af9632 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <[email protected]> Date: Mon, 19 Jan 2026 21:05:46 +0000 Subject: [PATCH] Remove experimental from lifetime-safety --- clang/docs/ReleaseNotes.rst | 27 +++++++++++++++++++ clang/include/clang/Basic/DiagnosticGroups.td | 12 ++++----- clang/include/clang/Basic/LangOptions.def | 6 ++--- clang/include/clang/Options/Options.td | 6 ++--- clang/lib/Sema/AnalysisBasedWarnings.cpp | 12 ++++++++- .../test/Analysis/LifetimeSafety/benchmark.py | 3 +-- .../Sema/warn-lifetime-analysis-nocfg.cpp | 4 +-- .../Sema/warn-lifetime-safety-dataflow.cpp | 2 +- ...n-lifetime-safety-missing-origin-stats.cpp | 2 +- .../Sema/warn-lifetime-safety-suggestions.cpp | 2 +- clang/test/Sema/warn-lifetime-safety.cpp | 4 +-- 11 files changed, 58 insertions(+), 22 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index bde3bb1e81210..5cbfde726af0c 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -118,6 +118,33 @@ Attribute Changes in Clang Improvements to Clang's diagnostics ----------------------------------- +- Added ``-Wlifetime-safety`` to enable lifetime safety analysis, + a CFG-based intra-procedural analysis that detects use-after-free and related + temporal safety bugs. See the + `RFC <https://discourse.llvm.org/t/rfc-intra-procedural-lifetime-analysis-in-clang/86291>`_ + for more details. By design, this warning is enabled in ``-Wall``. To disable + the analysis, use ``-Wno-lifetime-safety`` or ``-fno-lifetime-safety``. + +- Added ``-Wlifetime-safety-suggestions`` to enable lifetime annotation suggestions. + This provides suggestions for function parameters that + should be marked ``[[clang::lifetimebound]]`` based on lifetime analysis. For + example, for the following function: + + .. code-block:: c++ + + int* p(int *in) { return in; } + + Clang will suggest: + + .. code-block:: c++ + + warning: parameter in intra-TU function should be marked [[clang::lifetimebound]] + int* p(int *in) { return in; } + ^~~~~~~ + [[clang::lifetimebound]] + note: param returned here + int* p(int *in) { return in; } + ^~ Improvements to Clang's time-trace ---------------------------------- diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index de1d1e13ea712..34624dd3eed3a 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -533,20 +533,20 @@ def Dangling : DiagGroup<"dangling", [DanglingAssignment, DanglingGsl, ReturnStackAddress]>; -def LifetimeSafetyPermissive : DiagGroup<"experimental-lifetime-safety-permissive">; -def LifetimeSafetyStrict : DiagGroup<"experimental-lifetime-safety-strict">; -def LifetimeSafety : DiagGroup<"experimental-lifetime-safety", +def LifetimeSafetyPermissive : DiagGroup<"lifetime-safety-permissive">; +def LifetimeSafetyStrict : DiagGroup<"lifetime-safety-strict">; +def LifetimeSafety : DiagGroup<"lifetime-safety", [LifetimeSafetyPermissive, LifetimeSafetyStrict]> { code Documentation = [{ Experimental warnings to detect use-after-free and related temporal safety bugs based on lifetime safety analysis. }]; } def LifetimeSafetyCrossTUSuggestions - : DiagGroup<"experimental-lifetime-safety-cross-tu-suggestions">; + : DiagGroup<"lifetime-safety-cross-tu-suggestions">; def LifetimeSafetyIntraTUSuggestions - : DiagGroup<"experimental-lifetime-safety-intra-tu-suggestions">; + : DiagGroup<"lifetime-safety-intra-tu-suggestions">; def LifetimeSafetySuggestions - : DiagGroup<"experimental-lifetime-safety-suggestions", + : DiagGroup<"lifetime-safety-suggestions", [LifetimeSafetyCrossTUSuggestions, LifetimeSafetyIntraTUSuggestions]> { code Documentation = [{ diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 36fec24638363..a86394aa44f6b 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -501,12 +501,12 @@ LANGOPT(CheckConstexprFunctionBodies, 1, 1, Benign, LANGOPT(BoundsSafety, 1, 0, NotCompatible, "Bounds safety extension for C") -LANGOPT(EnableLifetimeSafety, 1, 0, NotCompatible, "Experimental lifetime safety analysis for C++") +LANGOPT(EnableLifetimeSafety, 1, 0, NotCompatible, "Lifetime safety analysis for C++") -LANGOPT(EnableLifetimeSafetyInference, 1, 0, NotCompatible, "Experimental lifetime safety inference analysis for C++") +LANGOPT(EnableLifetimeSafetyInference, 1, 0, NotCompatible, "Lifetime safety inference analysis for C++") // TODO: Remove flag and default to end-of-TU analysis for lifetime safety after performance validation. -LANGOPT(EnableLifetimeSafetyTUAnalysis, 1, 0, NotCompatible, "Experimental lifetime safety at translation-unit end, analyzing functions in call graph post-order for C++") +LANGOPT(EnableLifetimeSafetyTUAnalysis, 1, 0, NotCompatible, "Lifetime safety at translation-unit end, analyzing functions in call graph post-order for C++") LANGOPT(PreserveVec3Type, 1, 0, NotCompatible, "Preserve 3-component vector type") diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 188739e72434a..88ae8a7286ee9 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -1961,15 +1961,15 @@ defm bounds_safety : BoolFOption< " experimental bounds safety extension for C">>; defm lifetime_safety : BoolFOption< - "experimental-lifetime-safety", - LangOpts<"EnableLifetimeSafety">, DefaultFalse, + "lifetime-safety", + LangOpts<"EnableLifetimeSafety">, DefaultTrue, PosFlag<SetTrue, [], [CC1Option], "Enable">, NegFlag<SetFalse, [], [CC1Option], "Disable">, BothFlags<[], [CC1Option], " experimental lifetime safety for C++">>; defm lifetime_safety_inference - : BoolFOption<"experimental-lifetime-safety-inference", + : BoolFOption<"lifetime-safety-inference", LangOpts<"EnableLifetimeSafetyInference">, DefaultFalse, PosFlag<SetTrue, [], [CC1Option], "Enable">, NegFlag<SetFalse, [], [CC1Option], "Disable">, diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index 793ece2c937de..4a1ec4ddb004c 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -3063,9 +3063,19 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings( AC.getCFGBuildOptions().AddCXXNewAllocator = false; AC.getCFGBuildOptions().AddCXXDefaultInitExprInCtors = true; + bool IsLifetimeSafetyDiagnosticEnabled = + !Diags.isIgnored(diag::warn_lifetime_safety_loan_expires_permissive, + D->getBeginLoc()) || + !Diags.isIgnored(diag::warn_lifetime_safety_loan_expires_strict, + D->getBeginLoc()) || + !Diags.isIgnored(diag::warn_lifetime_safety_return_stack_addr_permissive, + D->getBeginLoc()) || + !Diags.isIgnored(diag::warn_lifetime_safety_return_stack_addr_strict, + D->getBeginLoc()); bool EnableLifetimeSafetyAnalysis = S.getLangOpts().EnableLifetimeSafety && - !S.getLangOpts().EnableLifetimeSafetyTUAnalysis; + !S.getLangOpts().EnableLifetimeSafetyTUAnalysis && + IsLifetimeSafetyDiagnosticEnabled; // Force that certain expressions appear as CFGElements in the CFG. This // is used to speed up various analyses. diff --git a/clang/test/Analysis/LifetimeSafety/benchmark.py b/clang/test/Analysis/LifetimeSafety/benchmark.py index cd5b30818a4a8..a7fe5d28cb884 100644 --- a/clang/test/Analysis/LifetimeSafety/benchmark.py +++ b/clang/test/Analysis/LifetimeSafety/benchmark.py @@ -350,8 +350,7 @@ def run_single_test( "-o", "/dev/null", "-ftime-trace=" + trace_file, - "-Xclang", - "-fexperimental-lifetime-safety", + "-Wlifetime-safety", "-std=c++17", source_file, ] diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp index 86634e70eb4eb..a38a4b440891c 100644 --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -1,6 +1,6 @@ // RUN: %clang_cc1 -fsyntax-only -Wdangling -Wdangling-field -Wreturn-stack-address -verify %s -// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -Wexperimental-lifetime-safety -Wno-dangling -verify=cfg %s -// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -fexperimental-lifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wexperimental-lifetime-safety -Wno-dangling -verify=cfg %s +// RUN: %clang_cc1 -fsyntax-only -Wlifetime-safety -Wno-dangling -verify=cfg %s +// RUN: %clang_cc1 -fsyntax-only -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety -Wno-dangling -verify=cfg %s #include "Inputs/lifetime-analysis.h" diff --git a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp index 6fc7c776f935c..a45100feb3f28 100644 --- a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp +++ b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fexperimental-lifetime-safety -mllvm -debug-only=LifetimeFacts -Wexperimental-lifetime-safety %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -mllvm -debug-only=LifetimeFacts -Wlifetime-safety %s 2>&1 | FileCheck %s // REQUIRES: asserts struct MyObj { diff --git a/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp b/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp index 446bbe0e06b13..733b239ca3a57 100644 --- a/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp +++ b/clang/test/Sema/warn-lifetime-safety-missing-origin-stats.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -print-stats -fexperimental-lifetime-safety -Wexperimental-lifetime-safety %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -print-stats -Wlifetime-safety %s 2>&1 | FileCheck %s // CHECK: *** LifetimeSafety Missing Origin per QualType: (QualType : count) : diff --git a/clang/test/Sema/warn-lifetime-safety-suggestions.cpp b/clang/test/Sema/warn-lifetime-safety-suggestions.cpp index bb8fd3933b55d..974ea06e39651 100644 --- a/clang/test/Sema/warn-lifetime-safety-suggestions.cpp +++ b/clang/test/Sema/warn-lifetime-safety-suggestions.cpp @@ -1,6 +1,6 @@ // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -fexperimental-lifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wexperimental-lifetime-safety-suggestions -Wexperimental-lifetime-safety -Wno-dangling -I%t -verify %t/test_source.cpp +// RUN: %clang_cc1 -fsyntax-only -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety-suggestions -Wlifetime-safety -Wno-dangling -I%t -verify %t/test_source.cpp View definition_before_header(View a); diff --git a/clang/test/Sema/warn-lifetime-safety.cpp b/clang/test/Sema/warn-lifetime-safety.cpp index 11c86d23d89f6..4272f660a4adf 100644 --- a/clang/test/Sema/warn-lifetime-safety.cpp +++ b/clang/test/Sema/warn-lifetime-safety.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -Wexperimental-lifetime-safety -Wno-dangling -verify=expected,function %s -// RUN: %clang_cc1 -fsyntax-only -fexperimental-lifetime-safety -fexperimental-lifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wexperimental-lifetime-safety -Wno-dangling -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wlifetime-safety -Wno-dangling -verify=expected,function %s +// RUN: %clang_cc1 -fsyntax-only -flifetime-safety-inference -fexperimental-lifetime-safety-tu-analysis -Wlifetime-safety -Wno-dangling -verify %s #include "Inputs/lifetime-analysis.h" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
