【问题标题】:Force a C compiler to produce integer narrowing warning强制 C 编译器产生整数缩小警告
【发布时间】:2019-01-18 16:40:05
【问题描述】:

让我们考虑以下示例:

#include <stdio.h>

void func(unsigned char c) {
   printf("0x%x\n", c);
}

int main() {
   int val = 0x11223344;
   func(val);
}

据我所知,没有办法我可以强制 gccclang 在声明 func(val) 上显示关于缩小 int -> @987654326 的警告@那将在那里发生。甚至使用-Wall -Wextra -pedantic 编译也不行。该问题主要针对C 代码,但也值得将C++ 世界包括在讨论中(请参阅下面的注释)。

C++ 笔记

我很清楚在C++ 中存在一种使用统一初始化语法的解决方法:

func({val});

但这并没有解决我的问题,因为:

  • 对于预先存在的代码,它需要更改
  • 对于新代码,需要在任何地方使用{}

问题 1

在编译CC++ 代码时,是否有任何神秘的选项可以实现这一点?我也可以使用非标准解决方案,只要它适用于 gccclang 并且它确实需要更改代码。 注意:我不是在寻找棘手的C++ 解决方案,它使用带有或不带有包装原始类型的宏的自定义整数类型。我正在寻找类似命令行选项或pragma 的东西。同样,问题主要针对C 代码,但也值得探索任何C++ 解决方案。

问题 2(后备)

如果事实证明(怀疑)不存在这样的解决方案,我会非常好奇为什么要理解。我不敢相信这样的选择从未考虑过实施。应该有一个反对它的合理论据的清单,我只是想不出。但问题是该选项可能只是像-fwrapv 这样的非标准选项,人们只能在真正需要的地方使用它。

【问题讨论】:

  • 对于任何版本的 C/C++,规范中是否有任何必需的警告?我认为这取决于供应商的实现,因此对于语言和编译器来说非常具体。

标签: c compiler-warnings


【解决方案1】:

-Wconversion 是你要找的吗?

你可以看到here的行为,有很多案例。

【讨论】:

  • 是的,这正是我想要的! gcc 产生以下警告:warning: conversion to ‘unsigned char’ from ‘int’ may alter its value [-Wconversion]
  • 我正在等待 stackoverflow 允许我这样做(最短时间为 5 分钟)。非常感谢!!
  • @vvaltchev 乐于助人。你会认为-Wall 会更具包容性。顺便说一句,在clang,你可以使用-Weverything
  • 谢谢! -Weverything 看起来很棒。不幸的是,它在clang 6 上不存在 :-(
  • 可以使用-Weverything,但你不应该。 quuxplusone.github.io/blog/2018/12/06/dont-use-weverything。 GCC 没有这个标志正是因为它是一个坏主意。当你升级你的编译器时,你最终会得到像stackoverflow.com/q/64471930/148195 这样的虚假警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多