[PATCH] D132568: [clang][Sema] check default argument promotions for printf

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 31 09:53:34 PDT 2022


aaron.ballman accepted this revision.
aaron.ballman added a comment.

Basically LGTM as well, just some nits about comments and a small fix to the c status page.

In D132568#3753512 <https://reviews.llvm.org/D132568#3753512>, @inclyc wrote:

> Currently this patch has not fully implemented `wchar_t` related support, this
> type seems to be even platform dependent in C language, if possible, maybe we
> can consider support in subsequent patches?

I think that's reasonable.



================
Comment at: clang/lib/AST/FormatString.cpp:360
+      if (const auto *BT = argTy->getAs<BuiltinType>()) {
+        // the types are perfectly matched?
         switch (BT->getKind()) {
----------------



================
Comment at: clang/lib/AST/FormatString.cpp:371
+        }
+        // "partially matched" because of promotions?
+        if (!Ptr) {
----------------



================
Comment at: clang/lib/AST/FormatString.cpp:404
+      if (const auto *BT = argTy->getAs<BuiltinType>()) {
+        // check if the only difference between them is signed vs unsigned
+        // if true, we consider they are compatible.
----------------



================
Comment at: clang/lib/AST/FormatString.cpp:452
+          }
+          // "partially matched" because of promotions?
+          if (!Ptr) {
----------------



================
Comment at: clang/lib/AST/FormatString.cpp:401
+      if (const auto *BT = argTy->getAs<BuiltinType>()) {
+        if (!Ptr) {
+          switch (BT->getKind()) {
----------------
nickdesaulniers wrote:
> inclyc wrote:
> > nickdesaulniers wrote:
> > > aaron.ballman wrote:
> > > > It's a bit strange that we have two switches over the same `BT->getKind()` and the only difference is `!Ptr`; would it be easier to read if we combined the two switches into one and had logic in the individual cases for `Ptr` vs not `Ptr`?
> > > I almost made the same recommendation myself.  For the below switch pair, and the pair above.
> > > It's a bit strange that we have two switches over the same `BT->getKind()` and the only difference is `!Ptr`; would it be easier to read if we combined the two switches into one and had logic in the individual cases for `Ptr` vs not `Ptr`?
> > 
> > These two switch pairs have different functions. The lower one is only responsible for checking whether there is a signed or unsigned integer, and the upper one is checking whether there is a promotion (or type confusing). Will they be more difficult to understand if they are written together? 
> Perhaps.  I think the comments you added to all switches are helpful!
Yeah, let's leave the structure be for now, we can always clarify it further in an NFC follow-up if it turns out to be a reasonable suggestion.


================
Comment at: clang/lib/Sema/SemaChecking.cpp:10123-10125
+        // Consider character literal is a 'char' in C
+        // printf("%hd", 'a'); is more likey a type confusion situation
+        // We will suggest our users to use %hhd by discarding MatchPromotion
----------------



================
Comment at: clang/lib/Sema/SemaChecking.cpp:10131
+  if (Match == ArgType::MatchPromotion) {
+    if (!S.getLangOpts().ObjC &&
+        ImplicitMatch != ArgType::NoMatchPromotionTypeConfusion &&
----------------
We should probably have a comment here about why ObjC is special..


================
Comment at: clang/www/c_status.html:822
       <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2562.pdf">N2562</a></td>
-      <td class="partial" align="center">
-        <details><summary>Partial</summary>
-          Clang supports diagnostics checking format specifier validity, but
-          does not yet account for all of the changes in this paper, especially
-          regarding length modifiers like <code>h</code> and <code>hh</code>.
-        </details>
-      </td>
+      <td class="full" align="center">Clang 16</td>
     </tr>
----------------



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132568/new/

https://reviews.llvm.org/D132568



More information about the cfe-commits mailing list