在这里回答问题时,我举了以下例子:

#include <stdio.h>
#include <math.h>

int main (void) 
{
  float_t a = -248.75;
  printf("%f\n", a);

  unsigned char* ptr = (unsigned char*)&a;
  for(size_t i=0; i<sizeof(a); i++)
  {
    printf("%.2X ", ptr[i]);
  }
}

在版本13之前的GCC以及所有版本的clang上,这将提供预期的输出(x86小端):

-248.750000
00 C0 78 C3 

然而,当使用GCC 13.1编译时,我得到的输出是无稽之谈:

-248.750000
00 00 00 00 

进一步的判断表明,罪魁祸首是选项-std=c2x.如果我删除它,程序将按预期运行.

使用的编译器选项:-std=c2x -pedantic-errors -Wall -Wextra -O3 -lm.https://godbolt.org/z/4qbo74eEW

这是GCC身上已知的漏洞吗?

推荐答案

现将其作为GCC漏洞提交,参见.https://gcc.gnu.org/PR111884

V11和V12似乎对我很管用.

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

POSIX文件描述符位置

C编译器是否遵循restrict的正式定义?

测量ARM MCU中断延迟的问题

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

防止规范模式在C++中 echo 特殊字符

防止C++中递归函数使用堆栈内存

如何按顺序将所有CSV文件数据读入 struct 数组?

处理来自浏览器的HTTP请求

在C中使用无符号整数模拟有符号整数

';malloc():损坏的顶部大小';分配超过20万整数后

x86-64平台上的int_fast8_t大小与int_fast16_t大小

模仿 memmove 的行为

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

通过修改c中的合并排序对数组的偶数索引进行排序

C 语言中霍尔分区的快速排序算法

是什么阻止编译器优化手写的 memcmp()?

clion.我无法理解 Clion 中发生的 scanf 错误

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?