Author: Podchishchaeva, Mariya Date: 2023-09-01T01:38:07-07:00 New Revision: e4e56f91df6a6078a82abd59e00a93b63de664b7
URL: https://github.com/llvm/llvm-project/commit/e4e56f91df6a6078a82abd59e00a93b63de664b7 DIFF: https://github.com/llvm/llvm-project/commit/e4e56f91df6a6078a82abd59e00a93b63de664b7.diff LOG: [clang] Emit `Wformat` for bool value and char specifier confusion in scanf Fixes https://github.com/llvm/llvm-project/issues/64987 Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D159279 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/AST/FormatString.cpp clang/test/SemaCXX/format-strings-scanf.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index fc96ccb992ed78..e9c4010665b7c8 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -205,6 +205,9 @@ Bug Fixes in This Version - For function multi-versioning using the ``target`` or ``target_clones`` attributes, remove comdat for internal linkage functions. (`#65114 <https://github.com/llvm/llvm-project/issues/65114>`_) +- Clang now reports ``-Wformat`` for bool value and char specifier confusion + in scanf. Fixes + (`#64987 <https://github.com/llvm/llvm-project/issues/64987>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/FormatString.cpp b/clang/lib/AST/FormatString.cpp index f86278e4b5163d..e0c9e18cfe3a24 100644 --- a/clang/lib/AST/FormatString.cpp +++ b/clang/lib/AST/FormatString.cpp @@ -368,8 +368,11 @@ ArgType::matchesType(ASTContext &C, QualType argTy) const { case BuiltinType::SChar: case BuiltinType::UChar: case BuiltinType::Char_U: + return Match; case BuiltinType::Bool: - return Match; + if (!Ptr) + return Match; + break; } // "Partially matched" because of promotions? if (!Ptr) { @@ -410,11 +413,14 @@ ArgType::matchesType(ASTContext &C, QualType argTy) const { switch (BT->getKind()) { default: break; + case BuiltinType::Bool: + if (Ptr && (T == C.UnsignedCharTy || T == C.SignedCharTy)) + return NoMatch; + [[fallthrough]]; case BuiltinType::Char_S: case BuiltinType::SChar: case BuiltinType::Char_U: case BuiltinType::UChar: - case BuiltinType::Bool: if (T == C.UnsignedShortTy || T == C.ShortTy) return NoMatchTypeConfusion; if (T == C.UnsignedCharTy || T == C.SignedCharTy) diff --git a/clang/test/SemaCXX/format-strings-scanf.cpp b/clang/test/SemaCXX/format-strings-scanf.cpp index f78d334d1685ed..25fe5346791a0d 100644 --- a/clang/test/SemaCXX/format-strings-scanf.cpp +++ b/clang/test/SemaCXX/format-strings-scanf.cpp @@ -29,6 +29,8 @@ union bag { void test(void) { bag b; + // expected-warning@+2 {{format specifies type 'char *' but the argument has type 'bool *'}} + // expected-warning@+1 {{format specifies type 'unsigned char *' but the argument has type 'bool *'}} scan("%hhi %hhu %hhi %hhu", &b.sc, &b.uc, &b.b, &b.b); scan("%hi %hu", &b.ss, &b.us); scan("%i %u", &b.si, &b.ui); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits