diff options
author | Igor Kudrin <ikudrin@accesssoftek.com> | 2025-07-14 15:44:43 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-14 15:44:43 -0700 |
commit | 00dacf8c22f065cb52efb14cd091d441f19b319e (patch) | |
tree | 4f08dcec67d6cd6b89a7cd3602142e674702232c /clang/lib/Sema/AnalysisBasedWarnings.cpp | |
parent | 244ebef1ddbc6a77f17c36562d4a4292654940a6 (diff) | |
download | llvm-00dacf8c22f065cb52efb14cd091d441f19b319e.zip llvm-00dacf8c22f065cb52efb14cd091d441f19b319e.tar.gz llvm-00dacf8c22f065cb52efb14cd091d441f19b319e.tar.bz2 |
[clang] Add -Wuninitialized-const-pointer (#148337)
This option is similar to -Wuninitialized-const-reference, but diagnoses
the passing of an uninitialized value via a const pointer, like in the
following code:
```
void foo(const int *);
void test() {
int v;
foo(&v);
}
```
This is an extract from #147221 as suggested in [this
comment](https://github.com/llvm/llvm-project/pull/147221#discussion_r2190998730).
Diffstat (limited to 'clang/lib/Sema/AnalysisBasedWarnings.cpp')
-rw-r--r-- | clang/lib/Sema/AnalysisBasedWarnings.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index a4e5519..851f07b 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -994,6 +994,14 @@ static bool DiagnoseUninitializedConstRefUse(Sema &S, const VarDecl *VD, return !S.getDiagnostics().isLastDiagnosticIgnored(); } +/// Diagnose uninitialized const pointer usages. +static bool DiagnoseUninitializedConstPtrUse(Sema &S, const VarDecl *VD, + const UninitUse &Use) { + S.Diag(Use.getUser()->getBeginLoc(), diag::warn_uninit_const_pointer) + << VD->getDeclName() << Use.getUser()->getSourceRange(); + return !S.getDiagnostics().isLastDiagnosticIgnored(); +} + /// DiagnoseUninitializedUse -- Helper function for diagnosing uses of an /// uninitialized variable. This manages the different forms of diagnostic /// emitted for particular types of uses. Returns true if the use was diagnosed @@ -1599,9 +1607,9 @@ private: // a stable ordering. llvm::sort(*vec, [](const UninitUse &a, const UninitUse &b) { // Prefer the direct use of an uninitialized variable over its use via - // constant reference. - if (a.isConstRefUse() != b.isConstRefUse()) - return b.isConstRefUse(); + // constant reference or pointer. + if (a.isConstRefOrPtrUse() != b.isConstRefOrPtrUse()) + return b.isConstRefOrPtrUse(); // Prefer a more confident report over a less confident one. if (a.getKind() != b.getKind()) return a.getKind() > b.getKind(); @@ -1612,6 +1620,9 @@ private: if (U.isConstRefUse()) { if (DiagnoseUninitializedConstRefUse(S, vd, U)) return; + } else if (U.isConstPtrUse()) { + if (DiagnoseUninitializedConstPtrUse(S, vd, U)) + return; } else { // If we have self-init, downgrade all uses to 'may be uninitialized'. UninitUse Use = hasSelfInit ? UninitUse(U.getUser(), false) : U; @@ -2828,7 +2839,8 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings( if (!Diags.isIgnored(diag::warn_uninit_var, D->getBeginLoc()) || !Diags.isIgnored(diag::warn_sometimes_uninit_var, D->getBeginLoc()) || !Diags.isIgnored(diag::warn_maybe_uninit_var, D->getBeginLoc()) || - !Diags.isIgnored(diag::warn_uninit_const_reference, D->getBeginLoc())) { + !Diags.isIgnored(diag::warn_uninit_const_reference, D->getBeginLoc()) || + !Diags.isIgnored(diag::warn_uninit_const_pointer, D->getBeginLoc())) { if (CFG *cfg = AC.getCFG()) { UninitValsDiagReporter reporter(S); UninitVariablesAnalysisStats stats; |