release/22.x: [Sema] Fix ICE due to incorrect _Bool handling in format string checking (#174684)#178133
Closed
llvmbot wants to merge 1 commit intollvm:release/22.xfrom
Closed
release/22.x: [Sema] Fix ICE due to incorrect _Bool handling in format string checking (#174684)#178133llvmbot wants to merge 1 commit intollvm:release/22.xfrom
llvmbot wants to merge 1 commit intollvm:release/22.xfrom
Conversation
…ing (llvm#174684) Closes llvm#174331 (cherry picked from commit 15365d3)
Member
Author
|
@cor3ntin What do you think about merging this PR to the release branch? |
Member
Author
|
@llvm/pr-subscribers-clang Author: None (llvmbot) ChangesBackport 15365d3 Requested by: @zyn0217 Full diff: https://github.com/llvm/llvm-project/pull/178133.diff 2 Files Affected:
diff --git a/clang/lib/AST/FormatString.cpp b/clang/lib/AST/FormatString.cpp
index d4cb89b43ae87..36c5f57671631 100644
--- a/clang/lib/AST/FormatString.cpp
+++ b/clang/lib/AST/FormatString.cpp
@@ -371,7 +371,7 @@ static clang::analyze_format_string::ArgType::MatchKind
matchesSizeTPtrdiffT(ASTContext &C, QualType T, QualType E) {
using MatchKind = clang::analyze_format_string::ArgType::MatchKind;
- if (!T->isIntegerType())
+ if (!T->isIntegerType() || T->isBooleanType())
return MatchKind::NoMatch;
if (C.hasSameType(T, E))
diff --git a/clang/test/Sema/format-strings.c b/clang/test/Sema/format-strings.c
index 5280549adc3d7..cdac83fc0bb91 100644
--- a/clang/test/Sema/format-strings.c
+++ b/clang/test/Sema/format-strings.c
@@ -983,3 +983,35 @@ void test_promotion(void) {
// pointers
printf("%s", i); // expected-warning{{format specifies type 'char *' but the argument has type 'int'}}
}
+
+void test_bool(_Bool b, _Bool* bp)
+{
+ printf("%zu", b); // expected-warning-re{{format specifies type 'size_t' (aka '{{.+}}') but the argument has type '_Bool'}}
+ printf("%td", b); // expected-warning-re{{format specifies type 'ptrdiff_t' (aka '{{.+}}') but the argument has type '_Bool'}}
+ printf("%jd", b); // expected-warning-re{{format specifies type 'intmax_t' (aka '{{.+}}') but the argument has type '_Bool'}}
+ printf("%lld", b); // expected-warning{{format specifies type 'long long' but the argument has type '_Bool'}}
+ printf("%ld", b); // expected-warning{{format specifies type 'long' but the argument has type '_Bool'}}
+ printf("%d", b); // promoted from _Bool to int
+ printf("%hhd", b); // promoted from _Bool to int
+ printf("%hd", b); // promoted from _Bool to int
+#if !defined(__Fuchsia__) && !defined(__ANDROID__) //'%n' specifier not supported on this platform
+ // The n conversion specifier only supports signed types
+ printf("%zn", bp); // expected-warning-re{{format specifies type 'signed size_t *' (aka '{{.+}}') but the argument has type '_Bool *'}}
+ printf("%jn", bp); // expected-warning-re{{format specifies type 'intmax_t *' (aka '{{.+}}') but the argument has type '_Bool *'}}
+ printf("%lln", bp); // expected-warning{{format specifies type 'long long *' but the argument has type '_Bool *'}}
+ printf("%ln", bp); // expected-warning{{format specifies type 'long *' but the argument has type '_Bool *'}}
+ printf("%n", bp); // expected-warning{{format specifies type 'int *' but the argument has type '_Bool *'}}
+ printf("%hhn", bp); // expected-warning{{format specifies type 'signed char *' but the argument has type '_Bool *'}}
+ printf("%hn", bp); // belong to -Wformat-type-confusion
+#endif
+ printf("%c", b); // expected-warning{{using '%c' format specifier, but argument has boolean value}}
+ printf("%s", b); // expected-warning{{format specifies type 'char *' but the argument has type '_Bool'}}
+ printf("%d", b); // promoted from _Bool to int
+ printf("%o", b); // promoted from _Bool to int
+ printf("%x", b); // promoted from _Bool to int
+ printf("%u", b); // promoted from _Bool to int
+ printf("%f", b); // expected-warning{{format specifies type 'double' but the argument has type '_Bool'}}
+ printf("%e", b); // expected-warning{{format specifies type 'double' but the argument has type '_Bool'}}
+ printf("%a", b); // expected-warning{{format specifies type 'double' but the argument has type '_Bool'}}
+ printf("%g", b); // expected-warning{{format specifies type 'double' but the argument has type '_Bool'}}
+}
|
Collaborator
|
Note that this change alone is causing a lit test failure on 32-bit arm buildbots. See #174684 for details. |
Collaborator
|
test was fixed in #178450 |
Contributor
|
This pr should include the changes in #178450 then |
Collaborator
|
@zyn0217 any plans to fix this test? This has been open over a week now and rc3 is in less than a week |
Contributor
|
Sorry I missed this. I'll replace it with a manual backport PR |
Contributor
|
New PR in #179637 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Backport 15365d3
Requested by: @zyn0217