这是一本关于 C++ 中未定义行为(Undefined Behavior)的电子书的第一部分,主要内容如下:
- 介绍:一位曾经无忧的 C++ 程序员突然意识到自己熟悉的语言存在未定义行为,引发了对这一问题的深入探讨。作者强调这不是一本教材,而是给已熟悉 C++编程的人看的指南,PVS-Studio 的编辑 Andrey Karpov 参与了编辑和翻译工作。
- 未定义行为及其后果:未定义行为是某些编程语言的特性,语言规范故意不定义某些条件下程序的行为,以提高性能或实现某些功能。C++中未定义行为较为常见,可能导致各种奇怪的结果,如磁盘格式化、编译错误、运行时异常等。未定义行为易与未指定行为和实现定义行为混淆,且有库未定义行为和语言未定义行为两类。
- 如何寻找未定义行为:这是个难以解决的问题,类似于停机问题。可以使用各种静态分析工具(如 Cppcheck、Clang Static Analyzer、PVS-Studio 等)在编译前检查代码,编译器开启 -Wall 和 -Wpedantic 标志也能发现一些错误。还可以在编译时使用不同的输入和 constexpr 进行检查,在调试构建中利用标准库的 assert ,以及在构建时使用不同平台和优化级别来比较代码行为等。
- 窄化转换和隐式类型转换:C++允许隐式类型转换,这可能导致错误代码,包括有定义但意外的行为和未定义行为。例如在一些算术运算中,隐式类型转换可能导致结果与预期不同。隐式类型转换不仅适用于内置类型,还适用于复杂类型,会干扰合适函数重载的选择。应启用编译器警告并将单参数构造函数声明为 explicit ,以避免隐式转换带来的问题。
作者 Dmitry Sviridkin 有八年 C 和 C++高性能软件开发经验,目前在 AWS 从事系统和嵌入式开发;编辑 Andrey Karpov 有 15 年静态代码分析和软件质量经验,是 PVS-Studio 项目的联合创始人。电子书共 12 个部分,涵盖了 C++中各种可能导致未定义行为的情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。