也许只是我度过了奇怪的一天,但我有一些关于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);
}
Run Code Online (Sandbox Code Playgroud)
然后你按照如下方式使用 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.
Run Code Online (Sandbox Code Playgroud)
有一个不安全的指针。我确实同意goo(),使用通用指针,函数无法知道应用于它的索引(算术表达式)是否安全。请注意,这并不是因为我没有检查它是否为 NULL - 我只是没有保持示例简短。
我想不出一个安全的指针,指向C中的任意大小的向量,我可以将其传递给检索索引元素的函数 - 也许是因为我正处于奇怪的一天
对于 Clang 来说,什么是一个好的解决方案?
混合声明和代码与 C99 之前的标准不兼容。这很酷。这就是为什么我询问 C11 的命令行调用...
为什么它被公然忽略?(我知道我的奇怪的一天)
编辑:我添加了#include <stddef.h>,因为它丢失了。现在很奇怪:Clang 没有发现这一点。
我将考虑 @EricPostpischil 对该-Weverything选项的详细程度的评论以及Clang 手册中的描述来回答我的问题。
尽管我对 Clang 的喋喋不休并不完全满意,但我发现太多消息以及“某些诊断相互矛盾”这一事实(如文档本身所报告的那样)具有误导性。
\n我也承认,我错过了 Clang 开发人员“通常不建议使用它”,所以也许我只是随意地滥用了一个功能,认为可以吐出所有内容,而不是发现所有内容。
\n