Skip to content

Commit bc4d0a7

Browse files
committed
Changes after @ojhunt's review on 2025-09-09 (#157779)
1 parent 8fe991f commit bc4d0a7

File tree

5 files changed

+26
-35
lines changed

5 files changed

+26
-35
lines changed

clang/include/clang/AST/ASTContext.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,11 @@ class ASTContext : public RefCountedBase<ASTContext> {
659659
return findPointerAuthContent(T) != PointerAuthContent::None;
660660
}
661661

662+
// A simple helper function to short circuit pointer auth checks.
663+
bool isPointerAuthenticationAvailable() const {
664+
return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
665+
}
666+
662667
private:
663668
llvm::DenseMap<const CXXRecordDecl *, CXXRecordDeclRelocationInfo>
664669
RelocatableClasses;
@@ -670,10 +675,6 @@ class ASTContext : public RefCountedBase<ASTContext> {
670675
AddressDiscriminatedData
671676
};
672677

673-
// A simple helper function to short circuit pointer auth checks.
674-
bool isPointerAuthenticationAvailable() const {
675-
return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;
676-
}
677678
PointerAuthContent findPointerAuthContent(QualType T) const;
678679
mutable llvm::DenseMap<const RecordDecl *, PointerAuthContent>
679680
RecordContainsAddressDiscriminatedPointerAuth;

clang/include/clang/Basic/DiagnosticGroups.td

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,6 @@ def GNUZeroLineDirective : DiagGroup<"gnu-zero-line-directive">;
10721072
def GNUZeroVariadicMacroArguments : DiagGroup<"gnu-zero-variadic-macro-arguments", [VariadicMacroArgumentsOmitted]>;
10731073
def MisleadingIndentation : DiagGroup<"misleading-indentation">;
10741074
def PtrAuthNullPointers : DiagGroup<"ptrauth-null-pointers">;
1075-
def PtrAuthWeakSchema : DiagGroup<"ptrauth-weak-schema">;
10761075

10771076
// This covers both the deprecated case (in C++98)
10781077
// and the extension case (in C++11 onwards).

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,9 +1047,10 @@ def err_ptrauth_extra_discriminator_invalid : Error<
10471047
"invalid extra discriminator flag '%0'; '__ptrauth' requires a value between "
10481048
"'0' and '%1'">;
10491049
def warn_ptrauth_weak_schema
1050-
: Warning<"internal variable %0 is using a weak signing schema for pointer "
1051-
"authentication">,
1052-
InGroup<PtrAuthWeakSchema>;
1050+
: Warning<"%0 has internal linkage with a %select{|default }1"
1051+
"pointer authentication schema that should be overridden by "
1052+
"%select{a|an explicit}1 schema with unique diversifiers">,
1053+
InGroup<DiagGroup<"ptrauth-weak-schema">>;
10531054

10541055
/// main()
10551056
// static main() is not an error in C, just in C++.

clang/lib/Sema/SemaDecl.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8359,11 +8359,13 @@ NamedDecl *Sema::ActOnVariableDeclarator(
83598359

83608360
// Warn about the use of a weak pointer authentication schema on a variable
83618361
// with internal linkage.
8362-
if (getLangOpts().PointerAuthCalls && NewVD->isFunctionPointerType() &&
8363-
!isExternallyVisible(NewVD->getLinkageInternal())) {
8362+
if (Context.isPointerAuthenticationAvailable() &&
8363+
NewVD->isFunctionPointerType() && !NewVD->isExternallyVisible()) {
83648364
PointerAuthQualifier Q = NewVD->getType().getQualifiers().getPointerAuth();
8365-
if (!Q || (!Q.isAddressDiscriminated() && Q.getExtraDiscriminator() == 0))
8366-
Diag(NewVD->getLocation(), diag::warn_ptrauth_weak_schema) << NewVD;
8365+
if (!Q || (!Q.isAddressDiscriminated() && Q.getExtraDiscriminator() == 0)) {
8366+
Diag(NewVD->getLocation(), diag::warn_ptrauth_weak_schema)
8367+
<< NewVD << (Q ? 0 : 1);
8368+
}
83678369
}
83688370

83698371
if (NewTemplate) {
Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
// RUN: %clang_cc1 -triple arm64e-apple-ios -fptrauth-calls -fptrauth-intrinsics -fsyntax-only -verify %s
2-
// RUN: %clang_cc1 -triple arm64e-apple-ios -DNO_PTRAUTH -fsyntax-only -verify %s
1+
// RUN: %clang_cc1 -triple arm64e-apple-ios -fptrauth-calls -fptrauth-intrinsics -fsyntax-only -Wno-unused-variable -verify %s
2+
// RUN: %clang_cc1 -triple arm64e-apple-ios -DNO_PTRAUTH -fsyntax-only -Wno-unused-variable -verify=noptrauth %s
33

4-
#if defined(NO_PTRAUTH)
5-
6-
#define FN_PTR_AUTH(address_diversity, constant_discriminator)
7-
// expected-no-diagnostics
8-
9-
#else // !defined(NO_PTRAUTH)
10-
11-
#if !__has_extension(ptrauth_qualifier)
12-
#error __ptrauth qualifier not enabled
13-
#endif
4+
// noptrauth-no-diagnostics
145

156
#include <ptrauth.h>
167

8+
#if defined(NO_PTRAUTH)
9+
#define FN_PTR_AUTH(address_diversity, constant_discriminator)
10+
#else
1711
#define FN_PTR_AUTH(address_diversity, constant_discriminator) \
1812
__ptrauth(ptrauth_key_function_pointer, address_diversity, constant_discriminator)
19-
20-
#endif // defined(NO_PTRAUTH)
13+
#endif
2114

2215
// Global variables with external linkage and weak pointer authentication should
2316
// not raise any warning.
@@ -34,9 +27,9 @@ static void(* FN_PTR_AUTH(1, 0) g3_internal_strong)(void);
3427
// Global variables with internal linkage and weak pointer authentication should
3528
// raise a warning.
3629
static void(* g1_internal_weak)(void);
37-
// expected-warning@-1 {{internal variable 'g1_internal_weak' is using a weak signing schema for pointer authentication}}
30+
// expected-warning@-1 {{'g1_internal_weak' has internal linkage with a default pointer authentication schema that should be overridden by an explicit schema with unique diversifiers}}
3831
static void(* FN_PTR_AUTH(0, 0) g2_internal_weak)(void);
39-
// expected-warning@-1 {{internal variable 'g2_internal_weak' is using a weak signing schema for pointer authentication}}
32+
// expected-warning@-1 {{'g2_internal_weak' has internal linkage with a pointer authentication schema that should be overridden by a schema with unique diversifiers}}
4033

4134
// Assert that -Wptrauth-weak-schema silences warnings.
4235
#pragma clang diagnostic push
@@ -46,23 +39,18 @@ static void(* g3_internal_weak)(void);
4639
#endif
4740

4841
void test_local_variables(void) {
49-
#pragma clang diagnostic push
50-
#pragma clang diagnostic ignored "-Wunused-variable"
51-
5242
#if !defined(NO_PTRAUTH)
5343
// Local variables (internal linkage) with weak pointer authentication
5444
// should raise a warning.
5545
static void(* l1_internal_weak)(void);
56-
// expected-warning@-1 {{internal variable 'l1_internal_weak' is using a weak signing schema for pointer authentication}}
46+
// expected-warning@-1 {{'l1_internal_weak' has internal linkage with a default pointer authentication schema that should be overridden by an explicit schema with unique diversifiers}}
5747
static void(* FN_PTR_AUTH(0, 0) l2_internal_weak)(void);
58-
// expected-warning@-1 {{internal variable 'l2_internal_weak' is using a weak signing schema for pointer authentication}}
48+
// expected-warning@-1 {{'l2_internal_weak' has internal linkage with a pointer authentication schema that should be overridden by a schema with unique diversifiers}}
5949
#endif
6050

6151
// Local variables (internal linkage) with strong pointer authentication
6252
// should not raise any warning.
6353
void(* FN_PTR_AUTH(1, 65535) l1_internal_strong)(void);
6454
void(* FN_PTR_AUTH(0, 65535) l2_internal_strong)(void);
6555
void(* FN_PTR_AUTH(1, 0) l3_internal_strong)(void);
66-
67-
#pragma clang diagnostic pop
6856
}

0 commit comments

Comments
 (0)