支持C++11的有缺陷编译器版本的存储库
Repository of buggy compiler versions for C++11 support
我有一个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的列表我们支持的编译器。如果您选择继续使用此编译器,请放心,但不要期待我们的全力支持技术支持,如果你发现问题。
我这么说的原因是:
- 你将无法证明除了黑名单上的版本之外的每个版本都是正确的。然而,无论你有什么测试用例,你都可以证明编译器X版本a.b.c-d是有效的[这并不意味着这个编译器没有bug,只是你在测试中没有遇到任何bug!]
- 即使编译器是"已知良好"的(根据定义的任何标准),您的特定代码也可能触发影响代码的错误
任何足够大的软件(或硬件)产品都会有错误。你只能通过测试来证明你的软件是有效的。依赖外部"编译器X的某个版本中有已知的错误"并不能帮助你避免影响代码的错误。话虽如此,大多数编译器都经过了很好的测试,所以你(通常)需要做一些非常不寻常/复杂的事情来让编译器失败。
调查Boost.Config,特别是标头<boost/config.hpp>
。
这包括一组用于各种编译器(以及不同版本的)的宏,这些宏指示哪些C++功能已启用、已损坏等。它还包括一个全面的测试套件,可用于测试任何新编译器是否缺少功能等。
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- C++:将控制台输出存储在宏中更好吗
- 导入库可以跨dll版本工作吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 是否可以在 C++11 中使用后续顺序一致加载对存储版本进行重新排序
- 支持C++11的有缺陷编译器版本的存储库