Blu*_*eft 12 c c++ undefined-behavior
有没有办法知道你的程序是否在C++(甚至C)中有未定义的行为,而不是记住整个规范?
我问的原因是我注意到很多程序在调试中工作但没有发布是由于未定义的行为.如果有一个工具来至少帮助发现UB会很好,所以我们知道存在问题的可能性.
Edw*_*nge 16
良好的编码标准.保护你自己.以下是一些想法:
代码必须在最高警告级别编译...... 没有警告.(换句话说,当设置为最高级别时,您的代码根本不能引发任何警告.)打开所有项目的警告标志错误.
当你使用其他人的图书馆时,这确实意味着一些额外的工作,因为他们可能没有这样做.您还会发现有些警告是没有意义的......当您的团队决定时,将这些警告单独关闭.
始终使用RAII.
永远不要使用C风格的演员! 决不! - 我认为有一些罕见的情况,你必须打破这个,但你可能永远找不到它们.
如果你必须reinterpret_cast或void强制转换然后使用包装器来确保你总是使用相同的类型进行转换.换句话说,将指针/对象包装在一个boost::any并将指针投射到您需要的任何内容中,并在另一侧执行相同操作.为什么?因为你总是知道reinterpret_cast要从哪种类型出来,并且boost::any强制执行你之后转换为正确的类型.这是最安全的.
始终 在声明点(或在类中的构造函数初始值设定项中)初始化变量.
还有更多,但这些是一些非常重要的开始.
没有人能记住这个标准.我们高级C++程序员所做的工作是使用我们知道的安全结构并保护自己不受人类本性的影响...我们不使用不安全的结构,除非我们必须这样做,然后我们会特别注意确保危险都被包裹在一个很好的安全界面中,经过了地狱和背部测试.
要记住哪一个在所有语言中都是通用的重要事项是:
使您的构造易于正确使用,并且难以正确使用
在所有情况下都无法检测到未定义的行为.例如,考虑一下x = x++ + 1;.如果你熟悉这门语言,你知道它是UB.现在,*p = (*p)++ + 1;显然也是UB,但是呢*q = (*p)++ + 1;?这是UB if q == p,但除了它的定义(如果看起来很尴尬).在给定的程序中,很可能在到达该行时证明p并且q永远不会相等,但通常不能这样做.
为了帮助发现UB,请使用您拥有的所有工具.好的编译器会警告至少更明显的情况,尽管你可能必须使用一些编译器选项来获得最佳覆盖.如果您有其他静态分析工具,请使用它们.
代码审查也非常适合发现此类问题.如果您有多个开发人员可用,请使用它们.
| 归档时间: |
|
| 查看次数: |
1877 次 |
| 最近记录: |