我通常是木材工人,而不是开发商。我正在学习C/C++用于嵌入式系统,同时试图使我的一些工具自主来节省我几个小时的重复工作。
现在,它很有趣而且进展顺利,我已经花了大概一百个小时的编码/学习时间,并且已经节省了更多的时间*。
因为我想继续下去,是购买和遵循misra编码规则的"强制性好主意"?米斯拉包含什么?只有编码规则,或是一些使其更安全的提示?
这些工具可能是危险的(毕竟它们会切割木头,人体的抵抗力要低得多…)。
注:我的测试显然分四步进行:
只是一张使用OSD&SD卡记录器运行的图片(有一天我会制作一个anylze工具并停止阅读这些工具)。
我把工具插上,上面什么都没有
我在泡沫上使用软钻/刀具。
我用手按紧急停止按钮,在很远的地方进行真正的测试。
另外,我是唯一的员工,没有其他人可以进入我的工作场所。
*现在我已经把一个钻孔机变成了一个3D的木头打印机(做不精确的部分工作),一个"刀板"变成了一个自动化的。
注2:我不是本地人,因此工具的名称可能已关闭。
- 米斯拉可以给你一个坏代码的警告,它可能会有所帮助,但它不是一个魔杖。您需要开始成为木材工人和开发人员,并理解您的代码。C有一个未定义行为的概念,这意味着如果存在这样的缺陷,代码可以以它想要的任何方式运行。所以不要相信那些看起来有效的代码;只有你知道的代码才有效。
- @用户694733这可能很奇怪,但我并不真正信任计算机,毕竟所有的代码都是我的,所以…如果在30小时的日志中,预期值的+5%中没有一个输出,那么我只使用我的代码。我的问题是:米斯拉规则会帮助我做一个更好的代码吗,或者它是更多地针对公司作为一种标志,他们可以显示给他们的客户?
- misra是一套编码规则,但最好阅读每个规则的解释并将其作为建议。也就是说,知道什么时候跟随他们,什么时候他们是胡说八道。有些规则使代码比没有它们更不安全,例如要求强制转换。
Misra最初是为汽车工业设计的,尽管它已经远远超过了这个阶段。米斯拉·吉德林所说的目标是:
- 确保安全
- 为软件带来健壮性、可靠性。
- 当与财产安全发生冲突时,必须优先考虑人身安全。
- 在系统设计中考虑随机故障和系统故障。
- 证明其稳健性,而不仅仅依赖于无故障。
- 在产品的设计、制造、操作、维修和处置过程中应用安全注意事项。
这些文档主要由基于规则的代码咨询信息组成,这些代码试图满足这些目标。这些年来,misra文件价格有所下降,一些文件可以从misra在线购买,只需10英镑+增值税。
然而,作为初学者和业余程序员,我建议首先加强你对C和C++的知识。虽然在大多数行业领域,遵循相关标准通常是很好的,但如果适用的话,编写文档的前提是读者在语言方面有着非常坚实的基础,并且在使用这些语言编写的全面商业类型应用程序的关注点和过程中也有着坚实的基础。如果您的工作坊仅供个人使用,并且取决于您管辖范围内的工作场所安全规则,我可以说,对语言、语言工具和硬件有一个很好的理解,可以让您在如何编写代码方面做出好的选择,而不是在这样的阶段阅读Misra。
正如上面所评论的,值得重申的是,misra并不是某种魔法棒或具体的方式,它可以保证你的代码是好的、有效的和安全的。好代码和坏代码都可以满足标准。在完全理解你所做的事情之前,遵循米斯拉的做法可能与确保你的车间里的每根电缆都整齐地钉在适当的位置上,然后用凿子刺伤你自己一样。
- 所以,现在它不是"强制性的",但在某种程度上,寻找它可能真的是一个好主意。我也检查了价格,它肯定不是一个问题。
- 绝对不是强制性的。尽管任何程序都遵循它不会造成伤害,但我知道它的主要用途是用于公司需要证明其代码符合该安全级别的应用程序。以现实生活为例,这可能意味着一个错误编码的功能,希望不会导致1000辆车的刹车失效。
- 有些规则实际上会导致错误的代码和禁止编译器检查。
- @Olaf可能是你和Misra-C:2004或更老的人一起工作过。关于隐式类型转换的规则在2012年的版本中得到了很大的改进。它更关注哪些类型可以安全地在它们之间转换,而不是像旧的misras中那样武断地"强制转换为底层类型"。
- @伦丁:是旧版本。但是IIRC,它仍然禁止某些编译器扩展,这实际上使代码更安全。gccs -fplan9扩展名的概念是明确反对misra的。我个人认为这是一本很好的书,但是一个好的程序员应该认真地阅读。一个糟糕的程序员用它不会真正写出更好的代码。太糟糕了,许多公司(尤其是汽车公司)把它当作一种宗教,认为它"除了米斯拉之外没有什么好东西",而设计公司指导方针的人没有足够的知识来理解问题。
- @Olaf根据Misra-C编写公司指导方针确实是相当有资格的工作。理想情况下,您至少有一名资深的C(10年以上经验)主管该文档。我认为这是大多数公司都会出错的地方,盲目地追随Misra-C和他们的(错误的)静态分析仪——这是一件危险的事情。当你从工具中得到警告时,misra-c做的最好,然后停下来想"这条规则是想告诉我什么?"。这意味着您最好要阅读并理解规则的基本原理,以便遵循规则(或忽略规则)。
- @伦丁:我就是这么说的:把它当作一个好的、简明的阅读来理解C中可能出现的问题。问题是大多数公司都有静态的misra-c编码准则,所以你不能在项目中做出例外。例如:简单的*p++并不是真正有害的;通常没有使用index操作符代替它。这可能会导致代码性能下降,尤其是在需要商用编译器的小型MCU上。这种编译器通常比GCC等现代编译器的优化要晚10年或更长时间。这使得应用misra变得更糟。
- "一个好的程序员应该不虔诚地遵循它"-合理的建议。我对所有这些编程规则的主要问题是它们鼓励自满和抑制思考。
- @但是,olaf *p++ + *p++是有害的、不明确的行为。有一个非常合理的misra规则,禁止使用++运算符和其他运算符。像while(a++ = b++)这样的代码是一个典型的"想成为惯用C"的例子,实际上它只是模糊的。它可以用几行代码重写,机器代码相同,但代码可读性更高:a=b; while(a) { a=b; a++; b++; }。
- @伦丁:问题在于,仍然有(非常昂贵的)商业编译器,它们会生成非常糟糕的代码。这种问题的一个结果是使用32位双核,其中8位单核就足够了。(讽刺的是,用于Big Iron的编译器可能会生成优化的代码)。我不同意*p++ = *q++的可读性较差。任何代码的读取都需要知道语言语法、语法和语义。只为初学者编码会导致代码从一代恶化到下一代,最终以C-pidgin结尾。
- @另一方面,一套正式、规范的规则禁止腐朽、个人编码议程和"艺术家"或穴居人行为。他们禁止主观的事情,如:"编程是艺术"或"为了理解我刚刚发明的这个把戏,你必须真的聪明,加入特权人士的私人俱乐部",但也有傲慢的观点,如"我是对的,其他人都是错的,绝大多数其他程序员都是该死的。"这种行为无疑是一个很大的问题。ch对于软件行业来说,比严格遵循编码标准的人更大的问题。
- @伦丁:编程是一种创造性的行为。然而,和音乐一样,也有一些作品只是令人讨厌的好品味。艺术不是那么多在文本本身,而是整个实现,就像一个单一的和弦不成杰作。比具体地遵循规则集更重要的是一致的编码风格。这已经禁止了太有创造性,因为这样的构造是特定于某个片段的。但这场讨论引得太远了,我认为我们并没有太多理解我们的意思。
- @我从奥拉夫引述的那句话中,伦丁获得了"优秀程序员"的资格。没有一套规则可以阻止你描述的程序员(也就是坏的程序员)产生坏代码。
- @不,编程更像是一门手艺,而不是一门艺术。
- @杰里米:也许我应该用"软件开发"。编码只占软件开发的10%。大约30-50%是测试(取决于应用领域和公司;-),其余的是艺术。如果架构是艺术,软件开发也是。至少如果你不使用标准软件。如果你被后者困住了,我会同情你的。它类似于画师和房屋画家。
- @伦丁:我会认为我是一个很好的软件开发人员,包括程序员。但是在我的领域和为不同的公司工作时,使用我自己的编码风格通常是有问题的。那会不会让我成为一个不好的程序员?我不这么认为。在那些项目中,我可以使用我自己的风格,直到现在还没有人抱怨;相反经验丰富的同事通常可以很好地处理我的代码库。这就是目标。请参阅上面关于初学者风格编码的内容。我同意宏执行,但另一方面,在任何情况下避免宏也是不好的样式。
- @奥拉夫,我还是不同意你。软件开发应该是工程学的,但它更接近于一门手艺(从意义上说)。手工艺品,不是巫术!).
- @杰里迈普:你必须关注整个领域,而不是桌面/移动开发领域(我从你的个人资料中了解)。嵌入式开发,例如,如果你不在像autosar这样的紧凑型系统中工作,但a e是定义项目的人(在一定程度上)。当然,像所有的任务一样,一个伟大的(可能是主要的)部分是标准的工作,但这与作曲家、作曲者或创意画家没有什么不同。在一个方面,lundin是对的:一个人应该对表达变得太有创造性,但那是一般性的建议,与特定的结构无关。
- 这可能是一个移动聊天的候选评论流,也许伙计们?-)
- @奥拉夫我爸爸(合格的重型电气工程师)笑着说,当人们形容写计算机程序为"工程"。我们能说的最好的是,我们渴望成为工程师,也许嵌入式编程的有限世界比大多数其他领域更近。
- @杰里米:你爸爸会惊讶于有多少模拟元件被ADC、DAC和DSP算法所取代。例如,今天专门的开关电源是建立在一个MCU周围,该MCU结合了规则算法。我谈到嵌入式系统作为一个整体系统。这包括电子计算机和软件。如果你用模拟元件或软件建立一个调节回路,那就没有什么区别了。只是后者更复杂,通常有更多的变量。也许你爸爸应该离开20世纪70年代,告诉他自己?(顺便说一句:我是个EE)
- @不,他不会的。首先,你认为他跟不上时代。其次,我说他是个重型电气工程师。他从事配电工作。如果低于10千伏,他就不麻烦了。但这并不是重点,在软件世界中,与其他工程学科相比,我们在良好的坚实实践方面毫无进展。这不是关键,这是诚实的,这并不奇怪,我们的贸易只存在了大约70年。即使是电子产品也比这长得多。
- @杰里米:即使是这样的系统,也越来越多地使用数字调节算法。如果他能跟上发展。我谈到了整个领域。你从蛋糕里挑葡萄干来找(你认为)我的声明不适用的东西,你认为它们涵盖了一切。但是软件开发是一个非常广泛的领域,从几乎全部的艺术领域,如计算机艺术到标准软件,从软件架构师、系统设计师到标准软件和维护或软件文档的油漆工。你真的需要更广阔的视野,学会区分。
- 从我的立场来看,你是在谈论嵌入式编程,我是在谈论通用计算。我的经验——这在一般的计算领域是相当可观的——是我们仍然处在一个不知道自己在做什么的时代。建立一个系统的活动是工艺工作,而不是工程。我们走得太久了。你可以说最后一句话,但我的不回答不应被视为承认失败。
misra-c是一套规则,它将强制您从C程序中排除众所周知的问题和定义不好的行为。它是C语言的一个"安全子集",通过规则禁止各种形式的危险实践,这些规则旨在解决众所周知的错误,例如依赖定义不好的行为或隐式类型转换。C语言是一种非常古老的语言,这意味着所有的语言缺陷都是众所周知的。
MISRA-C非常注重静态代码分析,以便在编译时发现错误。这是需要牢记的一点,据我所知,没有开源静态代码分析器工具可以检查MISRA-C的遵从性。商业工具往往非常昂贵,而且常常充满错误/误报。尽管如此,它们中的大多数还是有用的。
MISRA-C只专注于C编程,它不解决CPU或微控制器等问题,尽管它确实实施了某种形式的防御编程,这是一种对抗EMI、逃逸代码和其他形式的意外程序行为的计数器。(有关C之外的一般提示和技巧的列表,请参阅此。但并非所有这些都必须适用于您的特定机器。)
为了演示misra遵从性,您创建了一个"遵从性矩阵",它显示了如何捕获misra-c文档的每个指令/规则:通过编译器消息、同行评审、静态代码分析等。
文档中的大多数规则都很有意义,但有些规则没有意义。但是,MISRA-C允许偏离大多数规则,将其列为:
- 强制性的。不允许偏差。
- 推荐。如果不遵守规则,必须调用正式的偏差过程。
- 咨询的。一个人可以不做正式的偏离就偏离规则。
因此,创建MISRA-C合规性通常是通过建立公司编码标准来完成的,该标准涉及所有规则。实现它的最简单方法是在本文档中记录公司级别上遵循的规则和跳过的规则。然后相应地设置静态代码分析过滤器。
- 最近发布了一个可以检查misra-c 2012遵从性的开源工具:它是一个用于cppccheck的python插件,名为"misra"。