[clang] 1029747 - [Sema] Fix null pointer dereference handleAlwaysInlineAttr.

Voss, Matthew via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 16 19:53:27 PDT 2023


Hi Craig,

There are some failures on the PS5 buildbot after this change. Could you take a look?

https://lab.llvm.org/buildbot/#/builders/216/builds/18474

Thanks,
Matt 

> -----Original Message-----
> From: cfe-commits <cfe-commits-bounces at lists.llvm.org> On Behalf Of Craig
> Topper via cfe-commits
> Sent: Thursday, March 16, 2023 5:52 PM
> To: cfe-commits at lists.llvm.org
> Subject: [clang] 1029747 - [Sema] Fix null pointer dereference
> handleAlwaysInlineAttr.
> 
> 
> Author: Craig Topper
> Date: 2023-03-16T17:49:34-07:00
> New Revision: 10297470e953f4f3968c54c851c8af82b07af00b
> 
> URL: INVALID URI REMOVED
> project/commit/10297470e953f4f3968c54c851c8af82b07af00b__;!!JmoZiZGBv
> 3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3ln_WfRflk$
> DIFF: INVALID URI REMOVED
> project/commit/10297470e953f4f3968c54c851c8af82b07af00b.diff__;!!JmoZiZ
> GBv3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3lnHdJlBwk$
> 
> LOG: [Sema] Fix null pointer dereference handleAlwaysInlineAttr.
> 
> It's possible for `getCalleeDecl()` to return a null pointer.
> 
> This was encountered by a user of our downstream compiler.
> 
> The case involved a DependentScopeDeclRefExpr.
> 
> Since this seems to only be for a warning diagnostic, I skipped the diagnostic
> check if it returned null. But mabye there's a different way to fix this.
> 
> Reviewed By: erichkeane
> 
> Differential Revision:
> https://reviews.llvm.org/D146089
> 3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3lnaIroE7Q$
> 
> Added:
> 
> 
> Modified:
>     clang/lib/Sema/SemaStmtAttr.cpp
>     clang/test/Sema/attr-alwaysinline.cpp
>     clang/test/Sema/attr-noinline.cpp
> 
> Removed:
> 
> 
> 
> #################################################################
> ###############
> diff  --git a/clang/lib/Sema/SemaStmtAttr.cpp
> b/clang/lib/Sema/SemaStmtAttr.cpp index 6d443837a4c5..eeef85373ccb
> 100644
> --- a/clang/lib/Sema/SemaStmtAttr.cpp
> +++ b/clang/lib/Sema/SemaStmtAttr.cpp
> @@ -233,7 +233,8 @@ static Attr *handleNoInlineAttr(Sema &S, Stmt *St,
> const ParsedAttr &A,
> 
>    for (const auto *CallExpr : CEF.getCallExprs()) {
>      const Decl *Decl = CallExpr->getCalleeDecl();
> -    if (Decl->hasAttr<AlwaysInlineAttr>() || Decl->hasAttr<FlattenAttr>())
> +    if (Decl &&
> +        (Decl->hasAttr<AlwaysInlineAttr>() ||
> + Decl->hasAttr<FlattenAttr>()))
>        S.Diag(St->getBeginLoc(), diag::warn_function_stmt_attribute_precedence)
>            << A << (Decl->hasAttr<AlwaysInlineAttr>() ? 0 : 1);
>    }
> @@ -259,7 +260,7 @@ static Attr *handleAlwaysInlineAttr(Sema &S, Stmt *St,
> const ParsedAttr &A,
> 
>    for (const auto *CallExpr : CEF.getCallExprs()) {
>      const Decl *Decl = CallExpr->getCalleeDecl();
> -    if (Decl->hasAttr<NoInlineAttr>() || Decl->hasAttr<FlattenAttr>())
> +    if (Decl && (Decl->hasAttr<NoInlineAttr>() ||
> + Decl->hasAttr<FlattenAttr>()))
>        S.Diag(St->getBeginLoc(), diag::warn_function_stmt_attribute_precedence)
>            << A << (Decl->hasAttr<NoInlineAttr>() ? 2 : 1);
>    }
> 
> diff  --git a/clang/test/Sema/attr-alwaysinline.cpp b/clang/test/Sema/attr-
> alwaysinline.cpp
> index 6b8e8f215a4b..213d70407f48 100644
> --- a/clang/test/Sema/attr-alwaysinline.cpp
> +++ b/clang/test/Sema/attr-alwaysinline.cpp
> @@ -25,3 +25,22 @@ void foo() {
>  }
> 
>  [[clang::always_inline]] static int i = bar(); // expected-warning {{'always_inline'
> attribute only applies to functions and statements}}
> +
> +// This used to crash the compiler.
> +template<int D>
> +int foo(int x) {
> +    if constexpr (D > 1)
> +        [[clang::always_inline]] return foo<D-1>(x + 1);
> +    else
> +        return x;
> +}
> +
> +// FIXME: This should warn that always_inline statement attribute has
> +higher // precedence than the noinline function attribute.
> +template<int D> [[gnu::noinline]]
> +int bar(int x) {
> +    if constexpr (D > 1)
> +        [[clang::always_inline]] return bar<D-1>(x + 1);
> +    else
> +        return x;
> +}
> 
> diff  --git a/clang/test/Sema/attr-noinline.cpp b/clang/test/Sema/attr-
> noinline.cpp
> index d35782f11adb..a62ca1debcc5 100644
> --- a/clang/test/Sema/attr-noinline.cpp
> +++ b/clang/test/Sema/attr-noinline.cpp
> @@ -25,3 +25,22 @@ void foo() {
>  }
> 
>  [[clang::noinline]] static int i = bar(); // expected-warning {{'noinline' attribute
> only applies to functions and statements}}
> +
> +// This used to crash the compiler.
> +template<int D>
> +int foo(int x) {
> +    if constexpr (D > 1)
> +        [[clang::noinline]] return foo<D-1>(x + 1);
> +    else
> +        return x;
> +}
> +
> +// FIXME: This should warn that noinline statement attribute has higher
> +// precedence than the always_inline function attribute.
> +template<int D> [[clang::always_inline]] int bar(int x) {
> +    if constexpr (D > 1)
> +        [[clang::noinline]] return bar<D-1>(x + 1);
> +    else
> +        return x;
> +}
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> INVALID URI REMOVED
> commits__;!!JmoZiZGBv3RvKRSx!5T2bYoGu6_sqxRYd-ZFC--KklLgMVa3mP6dp-
> DaM426lCB_1eQvZAEGwE8Pe2BFekx30eRBU7KU4wdK2-3lnIjBE824$


More information about the cfe-commits mailing list