我发现,将表达式除以0不会报告错误.如果有人能告诉我原因,我将不胜感激. 以下是代码

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main() { 
  int result = 3/10*(7/0);
  printf("%d\n", result);
  //printf("%" PRIu64, result); 
  return 0; 
}

环境:

  • Ubuntu 22.04
  • GCC 11.3.0

Compile result: enter image description here

Run result: enter image description here

I have used gdb to debug the program and i found the expression will be optimized by the compiler (my guess). so i suspect that it's a bug in gcc. enter image description here

推荐答案

我发现,将表达式除以0不会报告错误.如果有人能告诉我原因,我将不胜感激.

就C语言规范而言,除以零会得到undefined behavior.既不要求在编译时或运行时诊断情况,也不要求任何特定结果.

但实际上,您的编译器does通过发出警告来诊断它.对于GCC,如果你想确保你不能忽视那个警告,那么启用-Werror将警告转化为错误,或者如果你想更有 Select 性地 Select -Werror=div-by-zero.

我已经使用gdb调试了程序,我发现编译器会对表达式进行优化(我猜).

看似合理.

所以我怀疑这是GCC身上的一个漏洞.

不是的.被零除是程序中的一个错误.GCC用这笔钱做的事情可能和你预期的不一样,但这并不会让GCC变得笨手笨脚.

C++相关问答推荐

你能用自己的地址声明一个C指针吗?

为什么这个C程序代码会产生以下结果?

如何将不同长度的位转换成字节数组?

在C中使用动态内存分配找到最小的负数

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

加密解密工作正常,但返回错误0x80090005

限制不同类型的限定符

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

如何用c语言修改shadow文件hash部分(编程)?

在C程序中使用Beaglebone Black UART的问题

将非连续物理内存映射到用户空间

为什么二进制文件的大小不会随着静态数据的大小而增加?

从整型转换为浮点型可能会改变其值.

UpDown控制与预期相反

在我的第一个C语言中观察到的错误';你好世界';程序

C中2个数字的加法 - 简单的人类方法

gdb - 你能找到持有内部 glibc 锁的线程吗?

获取 struct 中匿名 struct 的大小

`void foo(int a[static 0]);` 有效吗?