- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在下面的例子中:
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: Rule 5-2-7 (required):具有指针类型的对象不得直接或间接转换为不相关的指针类型。
好的,但是我们有很多代码,例如需要将地址转换为 char*
,然后将其与 std::ifstream
一起使用, read(char* buffer, int length)
函数需要将地址类型转换为 (char_t*
)。那么根据 MISRA 的说法,有人可以用 C++ 编程而不使用任何类型转换吗?该标准没有说明必须如何进行指针转换。
在我的生产代码中,我的问题在于使用 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真的是想什么都不要 Actor ,如果项目处于最后阶段,这很难做到。有两种选择:
1 - 一个一个地记录 MISRA 的偏差并解释为什么转换是好的,解释这是如何测试的(Q.Q. 建议)
2 - file.read() 使用 char 类型的字节数组,然后在安全读取文件内容后将字节数组转换为标题内容,这必须对每个成员一一完成,因为如果你转换 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 *
作为第一个参数传递给 std::istream::read()
并将 int32_t
作为第二个参数。两者实际上都是不正确的。实际参数是 char *
和 std::streamsize
类型(可以是,但不需要是 int32_t
)。
关于c++ - MISRA C++ 2008 规则 5-2-7 直接或间接违反 : An object with pointer type shall not be converted to an unrelated pointer type,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182306/
我需要在 nginx-ingress 版本上允许来自多个来源的请求:http://localhost:4200、http://localhost:4242 等1.7.1.但我无法对多个来源执行此操作,
我正在部署我使用 APIGILITY 开发的 API到 IIS。由于 IIS 不支持 .htaccess,我试图从 .htaccess 文件的内容创建 web.config 文件。我使用 IISv7.
我正在尝试更改上面 css 样式中的“宽度”规则。在“inspect element”中你可以看到宽度是1008px。我不希望它是 1008px 但它不会让我在 css 样式中更改它你可以看到它被“删
外部css赋值有2种方法,我用的是第一种;大多数网站使用第二种方法。我想知道我是否做错了! 第一种方法: 为几乎每个 css 规则创建一个类并在任何地方使用它们。 blah blah .f_
RDF使用 WEB 标识符 (URIs) 来标识资源,使用属性和属性值来描述资源 RDF 资源、属性和属性值 RDF使用 WEB 标识符来标识事物,并通过属性和属性值来描述资源。 关于资源、属性
我想挖掘特定的 rhs 规则。文档中有一个示例证明这是可能的,但仅适用于特定情况(如下所示)。先来一个数据集来说明我的问题: input {b=100002} 0.2500000 0.250000
我想让 nginx 从网站根目录(:http://localhost:8080/)提供一个静态文件,但它为我的代理通行证提供服务;它提供“/”规则而不是“=/”。 这是我的 nginx 配置的样子:
根据gnu make documentation , 如果一个规则通过一次调用生成多个目标(例如,一个配方执行一个带有多个输出文件的工具),你可以使用 '&:' 规则语法来告诉 make。但是,当在多
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我正在尝试做一些多态性练习,但我无法弄清楚这种多态性是如何工作的。我没有找到任何关于这种练习的深入信息。希望大家能给我一些解释。 练习1: class Top { public void m(
为了调试复杂的 XSLT 转换,我将其分为几个部分:首先构建 %.1.xml,然后使用它构建 %.2.xml ,最后构建 %.3.xml。一切正常,但如果我要求 Make 构建最后一个,Make 总是
我尝试了 hacerrank 的 slove 练习 Click我不知道如何添加这些规则: ► 它可以包含 4 个一组的数字,并用一个连字符“-”分隔。 ► 不得有 4 个或更多连续重复数字。 这是我的
我正在尝试编写一个小测验,我希望“再试一次”按钮遵循与“else”之前的“if”语句相同的规则 using System; public class Program { public stat
在我的 Spring/Boot Java 项目中,我有一组服务方法,例如以下一个: @Override public Decision create(String name, String descr
我正在阅读 Covariant virtual function .上面写着 假设 B::f 覆盖了虚函数 A::f。如果满足以下所有条件,A::f 和 B::f 的返回类型可能不同: 1) The
我工作的公司想要分发(在公共(public)链接中)具有内部签名的应用程序。我很确定 Apple 否认这种事情,但我在官方文档/契约(Contract)中没有找到任何相关信息。 有谁知道它到底是如何工
我是 CSS 新手。我观察到一个奇怪的 CSS 行为,其中一个元素具有以下 CSS 属性 .container .header{ color: #FFFFFF; font-size: 2em;
这个问题在这里已经有了答案: Is there a CSS selector for elements containing certain text? (21 个答案) 关闭 7 年前。
我有以下 CSS: workoutcal.css: .errorlist{ color:red; } 以下基本模板: base.html: {% load static %} {
我是一名优秀的程序员,十分优秀!