也许只是我今天过得很奇怪,但我有几个问题Clang需要一个简短示例的警告。
假设有一段时间有这样一段代码
/// \file unsafe.c
#include <stddef.h>
static int goo (int * pi, size_t a)
{
return pi[a];
}
int main (int argc, char *argv[])
{
(void)argc;
(void)argv;
int goz[4] = { 0, };
return goo(goz, 0);
}
然后你按照如下方式使用 Clang
# clang --version
clang version 16.0.3
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files (x86)\LLVM\bin
# clang -std=c11 -Weverything unsafe.c -o unsafe.exe
unsafe.c:4:24: warning: 'pi' is an unsafe pointer used for buffer access
[-Wunsafe-buffer-usage]
static int goo (int * pi, size_t a)
~~~~~~^~
unsafe.c:6:12: note: used in buffer access here
return pi[a];
^~
unsafe.c:13:13: warning: mixing declarations and code is incompatible with
standards before C99 [-Wdeclaration-after-statement]
int goz[4] = { 0, };
^
2 warnings generated.
-
有一个不安全的指针。我确实同意这个功能goo()
使用通用指针无法知道应用于它的索引(算术表达式)是否安全。
请注意,这不是因为我这样做了not检查它是否为 NULL - 我只是没有保持示例简短。
我想不出安全指针, to an 任意大小向量在C,我可以传递给一个检索索引元素的函数 - 也许是因为我今天过得很奇怪
对于 Clang 来说,什么是一个好的解决方案?
-
混合声明和代码与 C99 之前的标准不兼容。这很酷。这就是为什么我询问 C11 的命令行调用......
为什么它被公然忽视? (我知道我的奇怪的一天)
编辑:我添加了#include <stddef.h>
,因为它丢失了。现在很奇怪:Clang 没有发现这一点。
我将考虑回答我的问题 @EricPostpischil 发表的关于来自-Weverything
选项,以及对它的描述 https://clang.llvm.org/docs/UsersManual.html#diagnostics-enable-everything在 Clang 手册中。
虽然我对 Clang 并不完全满意chatter,我发现太多的消息会产生误导,而且事实上“一些诊断相互矛盾”(如文档本身所报告的)。
我也承认我怀念 Clang 开发人员如何“一般不建议使用”,所以也许我只是随意地滥用了一个功能spit out一切,而不是spotting一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)