【发布时间】:2021-02-26 15:03:19
【问题描述】:
我在编译 BoringSSL 时发现 gcc 和 clang 之间的行为存在差异,并且能够将其缩减为以下测试用例来说明:
typedef char *OPENSSL_STRING;
#if USE_TYPEDEF
#define constptr const OPENSSL_STRING
#else
#define constptr const char *
#endif
int
foo (const void **ap)
{
constptr a = (constptr) *ap;
return a != 0;
}
我测试了如下四种场景:
sh$ g++ -c t2.cc -Wignored-qualifiers -DUSE_TYPEDEF
t2.cc: In function ‘int foo(const void**)’:
t2.cc:11:30: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]
11 | constptr a = (constptr) *ap;
| ^~
sh$ g++ -c t2.cc -Wignored-qualifiers
sh$ clang++ -c t2.cc -Wignored-qualifiers -DUSE_TYPEDEF
sh$ clang++ -c t2.cc -Wignored-qualifiers
sh$
这是 gcc 中的一个错误 - 还是有更多我不明白的事情发生?
供参考:警告为in BoringSSL's stack.h
【问题讨论】:
-
您的测试用例中缺少
main()。 -
这个宏的存在真是莫名其妙。两个分支是相同的。
-
警告只是警告......请参阅 C++ 标准,如 n3337 并编写自己的 GCC plugin 以产生更多警告
-
该宏是来自 BoringSSL 还是完全代表 BoringSSL?它似乎破碎和毫无意义。
标签: c++ gcc clang qualifiers boringssl