inclyc added inline comments.
================ Comment at: clang/lib/AST/FormatString.cpp:422 + case BuiltinType::Bool: + // Don't warn printf("%hd", [char]) + // https://reviews.llvm.org/D66186 ---------------- aaron.ballman wrote: > The comment is talking about passing a `char` (promoted to `int`) then > printed as a `short` but the check is looking for the type to be printed as > an `int`; that doesn't seem like a type confusion situation so much as a > match due to promotion. Should the test below be looking for a short type > instead of an int type? > The comment is talking about passing a `char` (promoted to `int`) then > printed as a `short` but the check is looking for the type to be printed as > an `int`; that doesn't seem like a type confusion situation so much as a > match due to promotion. Should the test below be looking for a short type > instead of an int type? Sorry for this (sometimes shit happens). There is a lot of redundant logic in this place, I will upload the corrected code immediately. ================ Comment at: clang/test/Sema/format-strings-scanf.c:289-290 + // ill-formed floats + scanf("%hf", // expected-warning{{length modifier 'h' results in undefined behavior or no effect with 'f' conversion specifier}} + &sc); // Is this a clang bug ? + ---------------- aaron.ballman wrote: > inclyc wrote: > > aaron.ballman wrote: > > > Is what a clang bug? > > > > > > Also, what is with the "or no effect" in that wording? "This could cause > > > major issues or nothing bad at all might happen" is a very odd way to > > > word a diagnostic. :-D (Maybe something to look into improving in a later > > > patch.) > > > Is what a clang bug? > > > > Look at `sc` which is a `signed char`, but scanf need a pointer `float *`, > > I add this comment because I think there should be a warning like > > ``` > > format specifies type 'float *' but the argument has type 'signed short *' > > ``` > > > > See printf tests below > Oh I see what you're saying! There are two issues with the code: one is that > the format specifier itself is UB and the other is that the argument passed > to this confused format specifier does not agree. > > To me, the priority is the invalid format specifier; unless the user corrects > that, we're not really certain what they were aiming to scan in. And I think > it's *probably* more likely that the user made a typo in the format specifier > instead of trying to scan a half float (or whatever they thought they were > scanning) into a `signed char`, so it seems defensible to silence the > mismatched specifier diagnostic. > > WDYT? ``` printf("%hf", // expected-warning{{length modifier 'h' results in undefined behavior or no effect with 'f' conversion specifier}} sc); // expected-warning{{format specifies type 'double' but the argument has type 'signed char'}} ``` Then clang seems to have two different behaviors to `printf` and `scanf`, and for `printf` it will give the kind of diagnosis I said. I don't think this problem is particularly serious, because the key point is that using `%hf` UB. So maybe we can just keep clang as-is? Or we should consider implement the same warning in `scanf` ? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D132568/new/ https://reviews.llvm.org/D132568 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits