危险类型转换的 C 编译器警告

标签 c gcc clang compiler-warnings gcc-warning

对于我所知道的所有 C 编译器,-Wall警告隐式转换,但从不警告任何显式转换。我一直在试图找到一个标志(对于 gcc、clang、任何 c 编译器都可以),当存在导致未定义或实现定义的行为的强制转换时,它会导致发出警告。这是一个示例,说明我希望和不希望警告的地方:

#include <math.h>

struct person {
  int tag;
  char* name;
};

int foo(struct person* p) {
  int* tagPtr = (int*)p; // this cast is fine, cast to first member ptr is allowed
  double* badPtr = (double*)p; // this cast should cause warning
  return ((*tagPtr) + (int)(round(*badPtr)));
}
投到一个 int*定义明确,并且强制转换为 double*不是,但 gcc 没有警告我关于第二次转换。有没有办法让它这样做?或者其他编译器甚至 linter 是否提供此功能?
然后是“绝对明确定义”和“明确实现定义”之间的区域,即“可以根据上下文进行明确定义”。例如,从 int* 转换到 struct person*如果 int* 是明确定义的最初由另一个方向的类型转换形成(由 C 规范的第 6.7.2.1p15 节暗示)。指针的出处很少可用,因此编译器或 linter 不知道这个转换是健全的还是不健全的,只知道它可能是健全的。为了对我有用,警告危险转换功能需要 不是 在这种情况下发出警告,仅在强制转换是实现定义的行为的情况下。
有没有工具可以帮助解决这个问题?
对于上下文,我正在使用 C 作为带有标记变体的语言的目标。如果变体具有不同的尺寸,则类型转换是必不可少的。但是,如果编译器可以通过确保我不做任何无意义的转换来帮助现场检查我生成的代码,那就太好了。我怀疑优化编译器应该具有提供此警告的信息,因为这与别名分析所需的信息相同。我只是无法弄清楚是否有任何编译器将信息弯曲到此目的。

最佳答案

Is there a tool that can help with this?


是:您可以(可选)在 Visual Studio 2019 中安装和使用的 clang-cl 编译器。我将您的代码原封不动地复制/粘贴到我的 VS IDE 中,这是 clang 的回应:

warning : cast from 'struct person *' to 'double *' increases required alignment from 4 to 8 [-Wcast-align]


运行(静态)代码分析添加了以下内容:

warning GCC3CDF22: cast from 'struct person *' to 'double *' increases required alignment from 4 to 8 [clang-diagnostic-cast-align]

关于危险类型转换的 C 编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69302187/

相关文章:

c - 为什么采用 sizeof(array) 会在函数中发出警告,但在 main() 中却不会?

c++ - 新运营商崩溃

c - 如何实现两种结构的链表

c++ - Clang 4.6.2,使用 shared_ptr

c++ - 我怎样才能做 llvm 链接时间优化

c - 在 C 中引用 char 数组指针

c++ - 如何使用外部值创建表(数组)?

c - C 中动态大小的二维字符数组?

fscanf 的 C 段错误

c++ - Clang (OS X) 在特定的嵌套声明中需要 "template"关键字,而 VS 禁止它