当前位置: 首页 > 科技观察

热点技术:GCC6即将推出的新特性

时间:2023-03-19 17:35:58 科技观察

GCC项目每年3/4月都会进行重大更新。3月快到了,GCC项目的工程师们忙于GCC6的发布,百忙之中抽空简单说一下GCC6的一些新特性。警告GCC努力实现帮助开发人员在编译时捕获错误的警告,而不是让潜在危险的代码被默默地接受并最终部署。对于GCC6,主要增加了以下警告:Misleadingindentation:误导性缩进警告的目的是检测代码结构中与人类理解不符的代码块。最明显的例子就是2014年的“AppleSSL”漏洞,缩进不当看似将GOTO语句放在了IF条件语句中,但实际上并没有放在IF判断分支中。有关详细信息,请参阅DavidMalcolm的博客文章。相同值比较:代码中将对象与自身进行比较或始终与相同值进行比较的情况通常是代码中的拼写错误。GCC6将警告此类比较。重复条件:GCC6将警告IF-ELSE-IF比较链中的重复条件。负移位值和移位溢出:GCC现在会警告左移负值或左移位溢出。这种行为通常会导致未定义的结果,在编译时报告警告比在运行时产生未定义的结果更明智。空引用:GCC更积极地检测由于空指针引用或返回空值而导致错误和未定义行为的逻辑路径,或者将空值分配给明确需要非空值的函数参数。特性每个版本的gcc都带来了各种新特性,使使用GCC进行开发变得更加容易。即将发布的GCC6版本的亮点包括:OpenMP4.5:OpenMPAPI提供一组简单但高度灵活的接口来开发并行C、C++和Fortran程序。2015年11月,OpenMP4.5规范发布,在现有OpenMP4.0的基础上进行了多项改进。GCC6将为C和C++提供OpenMP4.5支持,为Fortran提供OpenMP4支持,并在一定程度上支持卸载,尤其是对IntelMIC处理器。段寄存器支持:x86/x86_64是一种分段内存架构,但GCC在很大程度上忽略了Intel架构的这一方面,而是依赖于隐式段寄存器。诸如linux内核或glibc之类的低级代码通常必须知道分段体系结构,传统上使用汇编语句进行显式段寄存器操作。从GCC6开始,变量可以在声明时分配给特殊段,并且在内存中使用这些变量时将操作显式段寄存器。增强位置和其他诊断工作:GCC6的诊断机制引入了“增强位置”功能。此功能允许CC跟踪一系列诊断信息,而不仅仅是单个点。例如,复杂表达式中有问题的子表达式可以被识别并突出显示给开发人员。诊断现在还包括“修复”提示,建议开发人员如何修复错误代码。此功能将在DavidMalcolm的另一篇博文中详细介绍。目标克隆:GCC6添加了一个新的“目标克隆”属性以指示特定函数需要针对不同的ISA变体进行多次编译,并创建一个程序调度程序来检测正在使用的ISA并调用适当的克隆。这使得为??不同版本的ISA提供“特殊运行时”程序支持变得更加容易。扩展存储规则:GCC6增加了一个新的pragma“scalar_storage_order”,用于指定结构中字段的字节顺序。如果目标的字节序与被访问对象的字节序不同,GCC6将自动生成代码以根据需要对这些对象进行字节交换。卸载/HSA:GCC5最初支持通过OpenMP卸载到MIC,通过OpenACC卸载到NvidiaGPUS。GCC6改进了这些功能并通过HSA加速器添加了卸载。语言和运行时GCC6现在默认为C++14。GCC6现在包括C++概念。C++运行时库现在支持特殊数学函数(ISO/IEC29124:2010)并支持C++17的实验特性std::uncaught_exceptionsunique_key映射try_emplace和insert_or_assign非成员函数std::size、std::empty和std::用于访问容器和数组的数据std::invokestd::shared_mutexstd::void_t和std::bool_constant对文件系统的实验性支持对于简单的情况,内部函数现在内联在Fortran前端中。当然,您可以找到并尝试更多的优化和修复。我什至不会尝试列举这个空间中发生的所有事情。这与以前的版本相同,我们将尝试改进生成的代码并修复尽可能多的报告错误。