MISRA C++ 2008 规则 5-2-7 违规:具有指针类型的对象不得直接或间接转换为不相关的指针类型

2024-01-06

在以下示例中:

void bad_function()
{  
  char_t * ptr = 0;

  // MISRA doesn't complains here, it allows cast of char* to void* pointer
  void* p2 = ptr;

  // the following 2 MISRA violations are reported in each of the casts bellow (two per code line)
  // (1) Event misra_violation:     [Required] MISRA C++-2008 Rule 5-2-7 violation: An object with pointer type shall not be converted to an unrelated pointer type, either directly or indirectly
  // (1) Event misra_violation:     [Required] MISRA C++-2008 Rule 5-2-8 violation: An object with integer type or pointer to void type shall not be converted to an object with pointer type
  ptr = (char_t*) (p2); 
  ptr = static_cast<char_t*> (p2); 
  ptr = reinterpret_cast<char_t*> (p2); 
}

报告了 MISRA 5-2-8 和 5-2-7 违规行为。

我怎样才能消除这种违规行为?

我需要有 C++ 静态分析经验的人来帮助我。几天来我对这些愚蠢的规则感到头疼。

根据 MISRA C++ 标准(MISRA-Cpp-2008.pdf:规则 5-2-7(强制):具有指针类型的对象不得直接或间接转换为不相关的指针类型。

好的,但是我们有很多代码,例如需要将地址转换为char*然后使用它std::ifstream, which read(char* buffer, int length)函数需要将地址类型转换为 (char_t*)。那么,根据 MISRA 人员的说法,如何才能用 C++ 进行编程而不使用任何类型转换呢?标准没有说明必须如何完成指针转换。

在我的生产代码中,我的问题在于使用 read with 进行文件读取操作std::ifstream来自预定义数据结构的文件:

if (file.read((char_t*)&info, (int32_t)sizeof(INFO)).gcount() != (int32_t)sizeof(INFO)
{
                LOG("ERROR: Couldn't read the file info header\n");
                res = GENERAL_FAILURE;
}

根据 MISRA 应该如何做?

那么有什么解决办法吗?

编辑:Peter 和 Q.Q.答案都是正确的,看来 MISRA 真的想在没有任何演员的情况下完成所有事情,如果项目处于最后阶段,这是很难做到的。有两种选择:

1 - 逐一记录 MISRA 偏差并解释为什么类型转换没问题,解释这是如何测试的(Q.Q.建议)

2 - 使用 char 类型的字节数组进行 file.read(),然后在安全读取文件内容后将字节数组转换为标题内容,必须对每个成员一一执行此操作,因为如果将 char* 转换为 int32_t再次违反规则 5-2-7。有时工作量太大了。


MISRA 规则的基本原因是,将任何指针/地址转换为任何非空指针都允许使用该地址,就好像它是与实际不同的对象一样。在这些情况下,编译器会抱怨隐式转换。使用类型转换(或 C++_cast运算符)本质上会停止编译抱怨,并且在太多情况下无法计数 - 取消引用该指针会产生未定义的行为。

换句话说,通过强制类型转换,您将引入潜在的未定义行为,并关闭编译器警告您这种可能性的所有可能性。 MISRA 认为这是一个坏主意……尽管许多考虑编码简易性的程序员认为在某些情况下这是一个好主意。

您必须认识到,MISRA 检查的理念不像典型的程序员那样关心编程的方便性,而是更关心防止未定义(或实现定义或未指定等)行为通过所有检查并导致代码“在野生”可能会造成伤害。

问题是,在您的实际用例中,您依赖于file.read()正确填充(大概)名为的数据结构info.

if (file.read((char_t*)&info, (int32_t)sizeof(INFO)).gcount() != (int32_t)sizeof(INFO)
{
            LOG("ERROR: Couldn't read the file info header\n");
            res = GENERAL_FAILURE;
}

您需要做的是更加努力地提供能够通过 MISRA 检查器的有效代码。就像是

std::streamsize size_to_read = whatever();
std::vector<char> buffer(size_to_read);  

if (file.read(&buffer[0], size_to_read) == size_to_read)
{
      //  use some rules to interpret contents of buffer (i.e. a protocol) and populate info
      // generally these rules will check that the data is in a valid form
      //   but not rely on doing any pointer type conversions
}
else
{
            LOG("ERROR: Couldn't read the file info header\n");
            res = GENERAL_FAILURE;
}

是的,我意识到这比简单地使用类型转换并允许二进制保存和读取结构需要更多的工作。但他们就是休息时间。除了通过 MISRA 检查器之外,如果操作正确,这种方法还有其他优点,例如文件格式完全独立于用于构建代码的编译器。您的代码取决于实现定义的数量(结构中成员的布局、sizeof)因此您的代码(如果使用编译器 A 构建)可能无法读取由编译器 B 构建的代码生成的文件。MISRA 要求的常见主题之一是减少或消除任何具有可能对实现敏感的行为的代码 -定义的数量。

注意:你也通过了char_t * to std::istream::read()作为第一个参数和int32_t作为第二个参数。实际上两者都是不正确的。实际参数的类型char * and std::streamsize(这可能是,但不必须是int32_t).

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

MISRA C++ 2008 规则 5-2-7 违规:具有指针类型的对象不得直接或间接转换为不相关的指针类型 的相关文章

  • 函数的不明确的引用/值版本

    考虑以下函数原型 void Remove SomeContainer Vec const std size t Index SomeContainer Remove SomeContainer Vec const std size t In
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 使用 CMake 对 SDL 的未定义引用

    我正在使用 SDL v1 2 15 7 和 CMake 3 2 1 开发一个项目 在 h 文件中我添加了 include
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 为什么我在这段代码中不断得到两个相同的随机值? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 https stackoverflow com questions 932520 why does it appear that my random num
  • 二维数组的列求和

    我有一个IEnumerable
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • DataContractJsonSerializer 包含元素类型子类型的通用列表

    我要使用DataContractJsonSerializer用于 JSON 序列化 反序列化 我在 JSON 数组中有两种对象类型 并希望将它们都反序列化为相应的对象类型 具有以下类定义 DataContract public class
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 读取 .config 文件

    目前我有一个名为 router js 的文件 设置如下 var Server require mongodb Server var MongoDB require mongodb Db var dbPort 31979 var dbHost
  • “org.eclipse.jdt.launching.IVMInstall.getLibraryLocations()”的问题

    当我尝试在 Eclipse 中运行 Java 程序时 出现以下错误 在 启动 ConvertExcelToJSON 期间发生内部错误 无法调用 org eclipse jdt launching IVMInstall getLibraryL
  • 将 LEFT OUTER JOIN 查询转换为 Ecto

    我不知道如何将 SQL 语句转换为 Ecto 凤凰城设置 mix phx gen html Location Country countries name mix phx gen html Location FederalState fed
  • 在 RecyclerView 本身而不是项目上设置 OnClickListener

    我想设置一个OnClickListener on a RecyclerView 不在其物品上以便当用户点击时触发点击事件RecyclerView 即使它是空的或装满了物品 我正在使用MVVM I tried mRecyclerView se
  • 为与我们的服务器交互的 chrome 扩展实现 google oauth2

    想要什么 一个chrome扩展 它使用google ooauth2 0登录扩展 并使用访问令牌将他的操作数据安全地发送到我的服务器 我从访问令牌获取用户详细信息并保存他的操作 服务器在php中实现 我做了什么 使用重定向 URL 注册 Go
  • Active Admin 和 Apartment Gem

    我是 Active Admin 的新手 但从目前为止我所看到的情况来看 我认为这很容易实现 我有一个带有公寓宝石的应用程序来添加多租户 我正在向我的应用程序添加活动管理员 Apartment 使用 PostgreSQL 模式来隔离数据 例如
  • 是否可以阻止您的网站在另一个域的框架集和 IFrame 内运行?

    最近我们遇到了一个问题 其他网站在一个框架集中运行我们的电子商务网站 而我们的网站 附加了违规者附属 ID 是单个全宽框架中的唯一内容 所以本质上它看起来和感觉就像我们的网站 其 URL 位于顶部 我们可以切断他们的会员 ID 这会让他们这
  • Python tkinter PhotoImage 无法正常工作

    我正在尝试使用 tkinter 但这段代码不起作用 我想知道是否有人知道为什么 谢谢 from tkinter import window Tk window title tkinter stuff photo1 PhotoImage fi
  • 如何找出计划任务的下一次运行时间?

    在 ColdFusion 9 中 是否有一种快速方法可以找出计划任务下次尝试运行的时间 我宁愿调用较低级别的 API 等来让 CF 计算它 以与通常相同的方式 我已经放弃了各种服务 并没有看到任何明显的方法可以调用 这会有所帮助 AFAIK
  • 重写Subject.next方法

    我有以下代码 我想在其中覆盖next有一些自定义逻辑 这种方式行不通 但只有在以下情况下才有效next是一个带有箭头函数的属性 其背后的原因是什么 export class Store
  • 合并具有相似名称的列

    我有一个带有非常烦人的变量名的数据框 基本上我对同一变量的观察分布在变量 g1 param1 g2 param1 g3 param1 等中 我想将它们全部加入到 1 个名为 param1 的变量 列中 g1 param1 g2 param1
  • 谷歌地点 API 是免费的吗? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我想用谷歌地点 API在网络应用程序中 我只是想确认API是否免费 如果是付费功能那么收费是多少 您可以查看每个API的定价here
  • C# 应用程序在远程上总是冻结

    我正在开发一个 C 应用程序 Net 3 5 Win Forms 该应用程序在服务器上运行 并由用户使用远程桌面访问 应用程序在远程计算机上看似随机的情况下一直冻结 即所有 GUI 组件都变成白色 任务管理器报告应用程序没有响应 但在本地运
  • 如何通过邮递员发送graphql查询?

    I use POST type URL http graphql Body query query noteTypes name label labelColor groupName groupLabel imageUrl 但它返回 mes
  • SAPUI5 表达式绑定

    是否可以将控件属性绑定到具有动态属性名称的模型 例如存储在另一个模型字段中 我以为我们可以使用 SAPUI5表达式绑定 https sapui5 hana ondemand com docs guide daf6852a04b44d1189
  • 在 Android 中的 BOOT_COMPLETE 上,未从 AndroidManifest 调用 BroadcastReceiver

    在我的 Android 应用程序中 我想运行Service无需打开 运行我的应用程序 为此我延长了BroadcastReciever班级 但是这个BroadcastReceiver类未被调用AndroidManifest xml on BO
  • 使用 jquery 拖放

    我有两个基于 jquery 的列表 示例是here http devheart org examples jquery customizable layout using drag and drop 2 saving and loading
  • 在 C# 桌面应用程序中存储我的 Amazon 凭证

    我正在考虑在桌面应用程序中使用 Amazon S3 和 simpleDB 我遇到的主要问题是我需要将我的 aws 凭证存储在应用程序中或使用其他方案 我猜想将它们存储在应用程序中是不可能的 因为它们很容易被挑选出来 另一种选择是创建一个 W
  • 如何在 Angular.js 中解析 Int

    也许 这是最简单的事情 但我无法将字符串解析为角度中的 Int 我正在尝试做的事情
  • MISRA C++ 2008 规则 5-2-7 违规:具有指针类型的对象不得直接或间接转换为不相关的指针类型

    在以下示例中 void bad function char t ptr 0 MISRA doesn t complains here it allows cast of char to void pointer void p2 ptr th