这种对有效类型规则的使用是否严格遵守?

2024-05-10

C99和C11中的有效类型规则规定,没有声明类型的存储可以用任何类型写入,并且存储非字符类型的值将相应地设置存储的有效类型。

抛开 INT_MAX 可能小于 123456789 的事实不谈,以下代码对有效类型规则的使用是否严格符合?

#include <stdlib.h>
#include <stdio.h>

/* Performs some calculations using using int, then float,
  then int.

    If both results are desired, do_test(intbuff, floatbuff, 1);
    For int only, do_test(intbuff, intbuff, 1);
    For float only, do_test(floatbuff, float_buff, 0);

  The latter two usages require storage with no declared type.    
*/

void do_test(void *p1, void *p2, int leave_as_int)
{
  *(int*)p1 = 1234000000;

  float f = *(int*)p1;
  *(float*)p2 = f*2-1234000000.0f;

  if (leave_as_int)
  {
    int i = *(float*)p2;
    *(int*)p1 = i+567890;
  }
}

void (*volatile test)(void *p1, void *p2, int leave_as_int) = do_test;

int main(void)
{
  int iresult;
  float fresult;
  void *p = malloc(sizeof(int) + sizeof(float));
  if (p)
  {
    test(p,p,1);
    iresult = *(int*)p;
    test(p,p,0);
    fresult = *(float*)p;
    free(p);
    printf("%10d %15.2f\n", iresult,fresult);
  }
  return 0;
}

根据我对标准的阅读,注释中描述的函数的所有三种用法都应该严格符合(整数范围问题除外)。因此代码应该输出1234567890 1234000000.00。然而,GCC 7.2 输出1234056789 1157904.00。我认为当leave_as_int为 0,则存储 123400000*p1将 123400000.0f 存储到*p2,但我在标准中没有看到任何授权这种行为的内容。我错过了什么,还是 gcc 不符合要求?


是的,这是一个 gcc 错误。我已将其(带有简化的测试用例)归档为https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82697 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82697 .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这种对有效类型规则的使用是否严格遵守? 的相关文章

随机推荐

  • 如何检查包含 NaN 的列表 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在我的 for 循环中 我的代码生成一个如下所示的列表 list 0 0 0 0 sum 0 0 0 0 该循环生成所有其他数字向量 但它也
  • 源服务器未找到目标资源的当前表示或不愿意透露该表示存在

    web xml
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • Android - 从服务器获取响应时验证 JSON 以避免 JSONException

    在我的一些与服务器通信并使用 http 获取响应的应用程序中 我使用 json 来格式化数据服务器端 当它到达设备时 我使用类似于我在 stackoverflow 上找到的代码 private class LoadData extends
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • JQuery - 如何检测给定 div 中存在给定类的 div 数量?

    我有一个这样的div div class x div 并包含在这个 div 中 我有几个像这样的 div div class y div div class y div div class y div etc 问题1 如何检测容器 div
  • Angular2 i18n:使用 XLIFF 的原因是什么?

    我有点不明白为什么 Angular 团队选择使用 XLIFF 而不是 JSON 我缺少什么 由于投票接近而编辑 我注意到有人说答案是基于观点而不是基于事实 XLIFF 的一个缺点是它比 JSON 更大 我试图了解除了偏好之外是否还有选择 X
  • 在模拟器上卸载应用程序后,NSUserDefaults 未清除

    这听起来可能很菜鸟 我想检查用户是否第二次进入我的应用程序 以便保留我正在使用的运行计数NSUserDefaults 我已经在我的中实现了以下代码rootViewController s viewDidLoad method NSUserD
  • svn获取当前用户

    如何获取特定工作站上使用 svn 的当前用户 我可以使用 svn exe 可执行文件和一些开关来获取该信息吗 Thanks 在 Linux 中 您将在主目录中找到以下文件 subversion auth svn simple 在此文件中 您
  • 如何在WCF Rest服务中从流上传图像

    我正在尝试创建 wcf 服务 该服务将上传 pdf doc xls 图像等文件 但 pdf txt 文件正在上传并正确打开 但是当我尝试上传图像文件时 文件正在上传 但是图像不可见 OperationContract WebInvoke M
  • Windows Azure 网站 - 获取实例标识符

    在具有多个实例的 Azure 网站上确定哪个实例正在响应 某些 ID 或其他唯一信息 的可能方法是什么 以下环境设置将包含当前请求正在其上运行的实例 ID WEBSITE INSTANCE ID 您还将在响应中收到此 id 作为 cooki
  • 当我没有指定 x64 平台而不是 AnyCPU 时,MSBuild 如何或为何选择 x64 平台?

    我在跑msbuild exe通过常规 PowerShell 控制台的 Rake 这是从诊断级别运行打印的命令 C Windows Microsoft NET Framework v4 0 30319 msbuild exe D Projec
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 使用 prawnto_2 gem 加载图像时,RAILS_ROOT 不再有效

    我正在将我的应用程序从 Rails 3 0 升级到 Rails 3 1 我已经尽可能地将旧插件转为 gems 其中包括用这个漂亮闪亮的新插件替换旧的 prawnto 插件对虾 2 https github com forrest prawn
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • ExtJS 4.1:如何将本地数据与 ajax 加载的数据合并到单个存储中?

    我正在寻找一种将本地数据与 ajax 加载的数据组合到单个存储中的方法 我很难用英语解释这一点 我希望这段代码能更明确 var store Ext create Ext data Store autoLoad true fields id
  • 如何链接到具有特定经度和纬度的 Google 地图?

    我有一个小应用程序 可以提供当前位置 经度和纬度 现在我必须浏览带有经度和纬度的谷歌地图 请建议我如何做到这一点 最好的方法是使用q参数 以便显示带有标记点的地图 例如 https maps google com q
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • 这种对有效类型规则的使用是否严格遵守?

    C99和C11中的有效类型规则规定 没有声明类型的存储可以用任何类型写入 并且存储非字符类型的值将相应地设置存储的有效类型 抛开 INT MAX 可能小于 123456789 的事实不谈 以下代码对有效类型规则的使用是否严格符合 inclu