【问题标题】:C loss of data or precision is not warned about by compiler编译器不会警告 C 丢失数据或精度
【发布时间】:2017-09-12 15:47:30
【问题描述】:

即使指定了-Wall,Apple 的 LLVM 也不会发出警告:

uint8_t tta;
typedef uint32_t TT;
TT ttb;
ttb= 0xdeadbeef;
tta = ttb;
// here tta is only 0xEF

如何强制编译器在赋值期间警告数据丢失?

【问题讨论】:

  • 不是精度损失,而是数据丢失。并且是完全合法的,编译器发出警告是可选的。
  • 它完全按照您的要求执行:丢弃前 3 个字节并将底部字节压缩到变量 uint8_t
  • 编译器应该警告真正的问题,比如未定义的行为等等。
  • @AnttiHaapala 然而,类似的事情被报告并被接受为 GCC 中的一个错误:gcc.gnu.org/bugzilla/show_bug.cgi?id=2707
  • @EugeneSh。是的,我的意思是-Wall 就是这样做的。它在 GCC 或 clang 中不包含 -Wconversion 或类似...

标签: c macos clang llvm compiler-warnings


【解决方案1】:

如果您使用-Wconversion,您会收到警告:

<stdin>:9:7: warning: implicit conversion loses integer precision: 'TT' (aka 'unsigned int') to 'uint8_t' (aka 'unsigned char') [-Wconversion]
tta = ttb;
    ~ ^~~
1 warning generated.

这是由 Apple 开发者工具的当前版本生成的:

Apple LLVM 版本 8.1.0 (clang-802.0.42)

【讨论】:

  • 我认为它是在 gcc 4.3 中添加的
  • 这是用clang。
  • 奇怪的是 -Wall 不包括 -Wconversion
  • @fff444:我认为将其包含在-Wall 中会被认为过于嘈杂,因为大多数代码都充满了这种截断转换。
  • 您可以使用-Weverything 启用-Wall 未涵盖的警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多