[PATCH] D25266: Add a static_assert to enforce that parameters to llvm::format() are not totally unsafe

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 6 11:23:50 PDT 2016


Since the attribute approach is tricky this patch seems like a simple
and obvious enough thing to do for now. LGTM and if we come up with
something better later we can always reevaluate.

Mehdi Amini <mehdi.amini at apple.com> writes:
> That’s a good idea, unfortunately: "error: format attribute requires
> variadic function”.
>
> Also since we end up calling snprintf, I wonder why we don’t already
> catch these there, it is correctly decorated with the attribute on
> Darwin. Issue with variadic template (or template alone)? I should try
> a minimal test case.
>
>  
>> On Oct 5, 2016, at 9:35 AM, Zachary Turner <zturner at google.com> wrote:
>> 
>> Can't you add __attribute__((format(printf))); to the constructor?  That would catch these issues.
>> 
>> On Wed, Oct 5, 2016 at 9:05 AM Mehdi AMINI via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>> mehdi_amini added a comment.
>> 
>> This is also catching existing latent bugs in the codebase:
>> 
>>   In file included from /llvm-project/llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp:55:
>>   /llvm-project/llvm/include/llvm/Support/Format.h:82:3: error: static_assert failed "format can't be used with non fundamental / non pointer type"
>>     static_assert(std::is_scalar<Arg>::value,
>>     ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~
>>   /llvm-project/llvm/include/llvm/Support/Format.h:105:5: note: in instantiation of template class 'llvm::validate_format_parameters<llvm::StringRef>' requested here
>>       validate_format_parameters<Ts...>();
>>       ^
>>   /llvm-project/llvm/include/llvm/Support/Format.h:124:10: note: in instantiation of member function 'llvm::format_object<llvm::StringRef>::format_object' requested here
>>     return format_object<Ts...>(Fmt, Vals...);
>>            ^
>>   /llvm-project/llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp:965:21: note: in instantiation of function template specialization 'llvm::format<llvm::StringRef>' requested here
>>       DEBUG(dbgs() << format("  %14s  ", TII->getName(MI->getOpcode())));
>> 
>> 
>> https://reviews.llvm.org/D25266 <https://reviews.llvm.org/D25266>
>> 
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>


More information about the llvm-commits mailing list