编码指南和自动规则检查实现可靠安全的CUDA开发
作者:Daniel Simon博士与Jan Aarsaether
为何需要编码指南
编码指南在软件工程和开发中的作用
编码指南建立了一套标准化规则,有助于创建可维护、稳健和可预测的代码。这些指南超越了单纯的风格建议。其倡导和强制执行的规范性能减少开发者之间的理解偏差,加速新团队成员融入,并为大型或分布式项目提供持续的代码质量保障。鉴于并行编程的复杂性,以及新开发者采用对英伟达CUDA的普及需求,编码指南和自动化工具在确保代码质量和快速上手方面发挥着关键作用。
在 CUDA 开发中,性能和并行特性尤其增加了代码复杂性,编码指南还能帮助避免那些可能仅在大规模或特定执行条件下才会显现的隐蔽错误。
安全性正成为CUDA日益重要的话题
从基于CPU的高性能计算代码向GPU加速计算的迁移开始,如今的GPU已不再局限于图形处理和高性能计算领域。如今,GPU已成为ADAS(高级驾驶辅助系统)、工业和医疗机器人等安全关键系统的加速器。在迈向物理人工智能时代以满足广泛标准是,“安全第一”成为首要准则。这一转变也为基于 GPU 的软件满足安全认证要求带来了新挑战。
随着 CUDA 在这些领域中扮演越来越重要的角色,开发者社区需要清晰且可执行的编码规范,不仅要确保性能和效率,更要保证可靠性与安全性。
安全监管行业:编码指南必不可少
汽车、航空航天、工业自动化和医疗器械等行业受严格安全标准(如ISO 26262、IEC 62304、IEC 61508)的监管。在这些领域,软件故障可能导致重大安全隐患。编码指南在此并非可选项,而是认证流程的强制要求,旨在:
- 降低危险编码模式的风险。
- 确保软件行为的可追溯性和可验证性。
- 支持审核和合规要求。
质量保证部门已不仅限于发现缺陷,开发者现在还需负责提供无缺陷的证据。此外,即使软件在无故障状态下按预期运行,仍需考量安全性因素。编码指南由业界专家开发并为其服务,旨在支持验证确认流程,是实现所需质量水平和透明度的关键工具。
功能安全编码指南
随着 CUDA 在受监管行业中的使用日益增多,例如用于自动驾驶汽车的实时感知或医疗保健领域的先进诊断,符合安全要求的CUDA开发需要遵循英伟达近期向用户社区提供的CUDA 编码指南(NCCG)。
CUDA以外的现有编码指南
针对C和C++语言,现有多套成熟的编码规范可供参考,这些规范构成了CUDA开发的基础:
- MISRA C:2025 / MISRA C++:20232023 源自汽车行业,目前已广泛应用于安全相关软件领域。
- CERT C / C++:专注于安全性和未定义行为。
- CWE:源自社区开发的常见软件及硬件安全缺陷清单衍生的规则集。
这些规则集的范围各不相同,但都致力于避免不安全的代码结构并提高代码可读性与可靠性。应用指南时需要注意一个微妙之处:开发者不仅需要考虑代码的当前版本,还需思考未来可能发生的修改,以及如何最小化这些变化对系统其他看似无关部分带来的风险。
CUDA的编码指南
根据前述MISRA规则集,CUDA不仅未被涵盖,还被标记为非法语言扩展。因此在使用CUDA的情况下,项目中使用MISRA检查的C/C++部分现在需要识别CUDA代码。
随着英伟达《CUDA C++安全关键编程指南》,一套涵盖CUDA开发的官方编码规范已正式面世。遵循安全工程中“有则必用”的核心原则,不仅新项目,现有项目也应在代码库中实施这些规则,以满足安全和可靠性的强制要求。
如何使用和执行编码指南
下面包含的一小段代码已经展示了不合规的行为。
在这种简单情况下,有的开发者可能会在手动代码审查时发现问题并让作者修正。
然而实际开发中,上述示例代码可能分散在不同文件中,如此一来,若审查范围涉及整个系统就会面临额外挑战。人类既不擅长也不愿意执行这种重复性任务:对照冗长的标准规范逐项检查每个代码片段。局限显而易见:根本无法指望手动审查能覆盖项目中每个变更请求的所有代码。
解决方案:将自动检查扩展到CUDA领域。针对标准C和C++的自动化检查工具已无处不在,而作为首创方案,Axivion CUDA NCCG Analyzer能够自动执行上述 CUDA-4.1规则及NCCG其余规范。当集成到CI/CD环境时,Axivion会将违规情况以批注形式反馈至变更请求中,供提交者或审阅者查看。
虽然代码合规性原则同样适用于CUDA,但其某些方面会影响静态代码分析,因此必须加以解决。
预防和纠正违规行为
在现有项目中引入编码指南时,往往会发现大量违规情况。试图一次性修复所有问题往往不切实际且容易导致工作停滞。借助Axivion,团队可以分阶段应对这一挑战:
- 基线管理与逐步改进:建立当前违规问题的基准线,通过每次迭代逐步减少违规数量。
- 即时修复:开发者在处理相关代码时,即时修正发现的违规问题。
- 预防:在添加新代码时,开发者可在将不稳定的代码推送至代码库之前,自动检查规则并修复问题。
- 主动清理:团队预留时间系统性地改进代码库关键部分,重点关注具有高运行时故障风险的规范条款以及在安全关键场景中被复用的模块。
这种渐进式方法使得指南采用可行且不会阻碍当前开发进程。
增量分析--“没坏就别修”
对于许多项目而言,某种程度上可以认为历史代码“保持原样”且经过实践验证。因此,Axivion 创新的增量分析并不关注完整的违规历史,而是聚焦每次提交或合并请求中引入的变更。开发者从而能够:
- 立即查看两个可选端点之间是否引入了新的违规。
- 优先修复与近期变更相关的发现问题。
- 确保项目整体质量随时间推移呈提升趋势。
这在大规模CUDA项目中尤其有用,在这些项目中遗留代码可能不完全符合现行可用规范,但新代码必须遵守。从本质上讲,新代码比已经“经过使用验证”的旧代码风险更高。
早发现,快修复:将指南检查融入工作流程
指南执行效果最佳时,是将其无缝融入开发与审查工作流之中。这一过程始于用户的工作站:
- 将指南检查结果集成到IDE(如Visual Studio Code、Eclipse)中可提供即时反馈。
- 本地分析能让开发者在将问题代码推送至代码库前就修复违规情况。
- 通过实施适当的策略,企业可以防止违规从开发者的工作桌渗透到项目代码中,从而最大程度减少软件侵蚀。
第二道防线是CI/CD集成:
- 在合并请求期间执行的自动化检查能确保在集成前捕获违规项,并即时呈现给评审者。
- 对重要分支的持续监控有助于保持长期的代码质量。
- 特性分支分析可提供早期反馈。
- 通过推送或拉取通知,相关方得以保持信息同步,并能迅速采取纠正措施。
将自动化检查嵌入整个工作流程后,遵循编码指南自然成为开发流程的一部分,而不再是事后补救。这不仅节省时间、减少人为错误,还能生成有助于合规认证的文档。
超越标准化指南
MISRA、NCCG等标准化规则集固然重要,但项目通常还需要针对自身需求量身定制的特定规则:
- 自定义指南:反映项目特定需求的命名约定、目录结构或CUDA内核启动模式等规则。
- 架构规则:验证是否符合模块化、安全概念和系统级设计决策。
- 鉴于阅读旧代码与编写新代码的时间比通常为1:1甚至高达10:1或更高,良好的代码可读性有助于控制成本并减少技术债务。
Axivion可轻松实施此类自定义规则,并将标准化规则与定制扩展相结合,确保指南既符合外部认证要求,又符合内部项目目标。
大型项目的架构验证
在大型CUDA项目中,复杂性超出了编码规则的范畴。Axivion Architecture Verification可检查已实现的软件结构是否与设计规范、安全理念及预期模块化方案保持一致,从而助力确保安全架构中的免干涉性(FFI)。通过严格监控不同安全级别架构组件间的交互,自动化架构验证能检测出所有非预期依赖关系、层级违规或架构漂移——这些问题在受监管领域至关重要。
深入了解使用Axivion进行CUDA C++开发



