不安全的指针和 Clang

LuC*_*LuC 8 c clang

也许只是我度过了奇怪的一天,但我有一些关于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)
  1. 有一个不安全的指针。我确实同意goo(),使用通用指针,函数无法知道应用于它的索引(算术表达式)是否安全。请注意,这并不是因为我没有检查它是否为 NULL - 我只是没有保持示例简短。
    我想不出一个安全的指针,指向C中的任意大小的向量,我可以将其传递给检索索引元素的函数 - 也许是因为我正处于奇怪的一天 对于 Clang 来说,什么是一个好的解决方案?

  2. 混合声明和代码与 C99 之前的标准不兼容。这很酷。这就是为什么我询问 C11 的命令行调用...
    为什么它被公然忽略?(我知道我的奇怪的一天)

编辑:我添加了#include <stddef.h>,因为它丢失了。现在很奇怪:Clang 没有发现这一点。

LuC*_*LuC 0

我将考虑 @EricPostpischil 对该-Weverything选项的详细程度的评论以及Clang 手册中的描述来回答我的问题。

\n

尽管我对 Clang 的喋喋不休并不完全满意,但我发现太多消息以及“某些诊断相互矛盾”这一事实(如文档本身所报告的那样)具有误导性。

\n

我也承认,我错过了 Clang 开发人员“通常不建议使用它”,所以也许我只是随意地滥用了一个功能,认为可以吐出所有内容,而不是发现所有内容。

\n