首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GCC和Clang printf格式检查不适用于模板函数中的解密类型

GCC和Clang printf格式检查不适用于模板函数中的解密类型
EN

Stack Overflow用户
提问于 2020-12-22 02:12:47
回答 1查看 514关注 0票数 1

这段代码即使使用-Wall -Werror也可以编译,但是它不应该:

代码语言:javascript
代码运行次数:0
运行
复制
#include <cstdio>

template <typename T>
void f()
{
    decltype(printf("%u", 1.0))* p = nullptr; // format does not match args
    (void)p;
}

void g()
{
    f<int>();
}

如果f()不是一个模板,GCC和Clang拒绝编译它,正如我所期望和希望的那样。但是正如上面所写的,GCC和Clang在没有任何警告的情况下编译了它。

GCC树干确实拒绝编译它,不像所有发布的版本。MSVC 19也是,但我不能用它。

,我的问题是:当格式与其论点不匹配时,您能对代码进行一些修改,使其至少在GCC 8.2中失败吗?如果它也适用于最近的Clang,那么加分也可以。

实际上,我不能用与printf()相同的签名调用printf(),甚至不能调用我自己的函数,因为我的实际代码中的一些参数来自对调用代价高昂的函数的调用。我希望能够确认printf()或类似的函数可以接受我的参数,而不实际调用任何这样的函数。

使用意外编译的模板演示:https://godbolt.org/z/rWxYob

没有正确拒绝编译的模板的演示:https://godbolt.org/z/xb6GYo

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-23 07:57:01

你可以试试:

代码语言:javascript
代码运行次数:0
运行
复制
template <typename T>
void f()
{
    if (false) { printf("%u", 1.0); } // format does not match args
}

您可能需要一些附加的实用程序来对状态进行无声警告,计算结果总是错误的,或者是无法到达的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65402444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档