支持C++11的有缺陷编译器版本的存储库

Repository of buggy compiler versions for C++11 support

本文关键字:存储 版本 有缺陷 C++11 支持 编译器      更新时间:2023-10-16

我有一个C++软件,可以用不同的操作系统、平台和;编译器。现在,编译器有时会出现错误,例如这一个,这意味着gcc 4.6.4和4.7.3之前的版本是不可行的。现在我可以包括一个展示bug的单元测试(也许这个问题会揭示确实这就是我应该做的),但这是一项乏味的任务:编译器bug有时很难重新修复,将其转化为单元测试可能也不容易。。。这时你就有了平台&编译器。

我要找的是一个存储库,它告诉我g++、clang++和msvc++的哪些版本在支持C++11时遇到了致命的bug(我不是在说缺失的功能,当没有功能时,我会处理它们)。然后,当在构建系统中使用它们进行构建时,我会发生致命的崩溃。不错的功能是,我甚至不必为了禁止编译器而遇到错误(所以我为自己省去了未来的麻烦)。

这样的名单存在吗?

这可能不是你想要的答案,但我相信正确的处理方法是有一个白名单,而不是黑名单。换句话说,有一个你知道有效的编译器列表,如果客户试图使用与你测试过的版本不同的版本进行构建,你会在构建脚本中发出一条警告消息,内容如下:

不支持此编译器,请参阅http://www.example.com/list_of_supported_compilers.html的列表我们支持的编译器。如果您选择继续使用此编译器,请放心,但不要期待我们的全力支持技术支持,如果你发现问题。

我这么说的原因是:

  1. 你将无法证明除了黑名单上的版本之外的每个版本都是正确的。然而,无论你有什么测试用例,你都可以证明编译器X版本a.b.c-d是有效的[这并不意味着这个编译器没有bug,只是你在测试中没有遇到任何bug!]
  2. 即使编译器是"已知良好"的(根据定义的任何标准),您的特定代码也可能触发影响代码的错误

任何足够大的软件(或硬件)产品都会有错误。你只能通过测试来证明你的软件是有效的。依赖外部"编译器X的某个版本中有已知的错误"并不能帮助你避免影响代码的错误。话虽如此,大多数编译器都经过了很好的测试,所以你(通常)需要做一些非常不寻常/复杂的事情来让编译器失败。

调查Boost.Config,特别是标头<boost/config.hpp>

这包括一组用于各种编译器(以及不同版本的)的宏,这些宏指示哪些C++功能已启用、已损坏等。它还包括一个全面的测试套件,可用于测试任何新编译器是否缺少功能等。