安全编码标准

共 17 题
📑 题目列表 17 题
#
★★★

1. CERT C L1(必须修复)、L2(强烈建议)、L3(推荐实践)的项目门禁分配

CERT C 规则的 L1、L2、L3 三级如何理解?项目门禁如何分配?

  • CERT C 规则的 L1/L2/L3 分级含义
  • 各等级的定义与严重性
  • 项目门禁(CI/静态分析)的分配策略

CERT C 规则分为三级:L1(必须修复)是可能直接导致安全漏洞或未定义行为的高危规则,如已释放内存访问、整型溢出,必须修复;L2(强烈建议)是可能导致缺陷或需深入分析的中危规则,强烈建议修复;L3(推荐实践)是良好实践、风险较低或需结合上下文的规则,推荐但可按需取舍。项目门禁分配:L1 作为 CI 静态分析必过门禁(阻断构建),L2 作为默认门禁(可带评审豁免),L3 作为软性门禁(告警或记录)。这样把有限资源优先投到高危规则。

分级让安全编码标准的执行有优先级。L1 阻断防高危漏洞,L2 覆盖常见缺陷,L3 提升代码质量,门禁分配与等级匹配避免"一刀切"或"流于形式"。

#
★★

2. CERT C MEM30-C(禁止访问已释放内存)、MEM31-C(不再需要时释放动态分配内存)、MEM33-C(含灵活数组成员的结构体需动态分配并复制)

解释 CERT C 的 MEM30-C、MEM31-C、MEM33-C 规则及其内容?

  • MEM30-C 禁止访问已释放内存(use-after-free)
  • MEM31-C 及时释放动态内存(防泄漏)
  • MEM33-C 灵活数组成员结构体的正确分配

三条内存规则:MEM30-C 禁止访问已释放内存(use-after-free),即 free 之后不得再解引用该指针,否则未定义行为;MEM31-C 不再需要时释放动态分配内存,防止内存泄漏,需成对管理 malloc/free 与 RAII 保证;MEM33-C 含灵活数组成员(flexible array member)的结构体需动态分配并复制,因为灵活数组成员不占结构体大小,必须按实际需分配额外空间并整体复制,避免越界。三者共同防止内存安全漏洞(悬垂指针、泄漏、越界)。

内存错误是 C 程序最高危漏洞源。遵守这些规则配合 RAII、智能指针与内存检查工具,可显著降低缓冲区溢出与 use-after-free 等漏洞。

// MEM30-C: 访问已释放内存是未定义行为
char *p = malloc(10);
free(p);
// strcpy(p, "x"); // 违规:use-after-free
#
★★

3. CERT C INT31-C(整型转换前范围检查)、INT32-C(有符号整型运算禁止溢出)与 INT33-C(除法/取余避免除零)

解释 CERT C 的 INT31-C、INT32-C、INT33-C 整型规则?

  • INT31-C 整型转换前的范围检查
  • INT32-C 有符号整型运算禁止溢出
  • INT33-C 除法/取余避免除零

三条整型规则:INT31-C 要求在进行整型转换(如窄化、符号扩展)前先检查值是否在目标类型范围内,防止改变符号或截断导致未定义行为/错误;INT32-C 要求有符号整型运算不得溢出(有符号溢出是未定义行为),需在运算前检查边界或使用安全运算;INT33-C 要求除法/取余前确保除数不为 0,避免除零导致未定义行为或崩溃。三者共同防止整型溢出、截断与除零等常见漏洞。

整型错误在 C 中隐蔽且常被利用(如绕过长度检查)。范围检查、溢出防护、除零防护是安全整型处理的三要素,配合安全库(如 C 的 CHECKS 宏)落地。

#
★★

4. MISRA C 2012 Rule 1.3(禁止未定义行为,-Wpedantic + UBSan 全量通过)

MISRA C 2012 Rule 1.3 要求什么?如何用 -Wpedantic 与 UBSan 落地?

  • Rule 1.3 禁止未定义行为
  • -Wpedantic 编译告警
  • UBSan(未定义行为消毒器)验证

MISRA C 2012 Rule 1.3 要求"禁止未定义行为"——即代码不得包含任何编译器未定义的行为(如有符号溢出、使用未初始化变量、越界、除零)。落地手段:用 -Wpedantic 编译器告警(对严格标准性/可疑代码告警)尽早暴露问题;用 UBSan(Undefined Behavior Sanitizer)在运行时检测未定义行为(编译时加 -fsanitize=undefined),在测试阶段全量通过,两者结合从"编译期告警+运行期检测"双通道保证无未定义行为。

未定义行为是 C/C++ 漏洞与不可预测性的根源。Rule 1.3 是 MISRA 的基础规则,-Wpedantic 静态暴露、UBSan 动态验证,配合全量测试覆盖实现"无 UB"。

#
★★

5. CERT C 的并发与线程规则中数据竞争、双重加锁、信号使用等规则在 C++11 线程库与原子操作下的落地方式,以及静态分析工具的覆盖情况?

CERT C 的并发与线程规则(数据竞争、双重加锁、信号使用)如何在 C++11 线程库与原子操作下落地?静态分析覆盖情况如何?

  • CERT C 并发规则(数据竞争、死锁、信号)
  • C++11 线程库与原子操作的正确使用
  • 静态分析工具的覆盖

CERT C 并发规则涵盖数据竞争、死锁、双重加锁、信号使用等。在 C++11 下落地:用 std::thread 与 std::mutex(RAII 的 std::lock_guard)管理锁,避免手动加解锁遗漏;用 std::atomic 原子类型处理简单共享变量,避免数据竞争;用 std::lock 同时锁多把锁避免死锁;信号处理需使用异步信号安全函数。静态分析工具(如 Clang ThreadSafety、Coverity、SonarQube)能检测部分数据竞争、双重加锁与锁顺序问题,但并发问题的完整检测较难(尤其跨线程数据流),仍依赖设计(最小化共享状态)+动态检测(TSan,线程消毒器)补充。

并发漏洞(数据竞争、死锁)难以完全静态定位。落地策略:C++11 提供 RAII 与原子基础,静态分析覆盖常见模式,TSan 动态检测补充,结合"最小化共享状态"的设计原则。

#
★★

6. 安全编码清单中输入、输出、认证与加密?

安全编码清单应覆盖输入、输出、认证与加密哪些要点?

  • 输入校验(防注入、越界)
  • 输出编码(防注入、XSS)
  • 认证与加密(强认证、安全加密)

安全编码清单覆盖四大类:输入——所有外部输入需校验(长度、类型、范围、白名单),防止注入(SQL/命令/路径)与越界;输出——所有输出需编码/转义(HTML 编码防 XSS、防止敏感信息泄露),防止注入与泄露;认证——使用强认证、安全的密码存储(哈希+盐)、会话安全、多因素认证,防止绕过;加密——使用强算法与库(AES、TLS)、安全的密钥管理、防止明文传输与硬编码密钥。清单作为编码检查基准,确保安全编码不留死角。

输入、输出、认证、加密是安全编码的四大支柱,分别对应注入、XSS、认证绕过、数据泄露等主流漏洞。清单化让安全编码可检查、可执行。

#
★★

7. 安全编码标准与编译器告警的映射中 CERT/MISRA 规则如何映射到 -Wconversion、-Wnull-dereference、-fanalyzer 等编译告警与 SonarQube 配置,减少人工检查成本?

如何将 CERT/MISRA 规则映射到编译器告警与 SonarQube 配置,减少人工检查成本?

  • 规则到编译告警的映射(-Wconversion、-Wnull-dereference、-fanalyzer)
  • SonarQube 规则集配置
  • 自动化替代人工检查

将 CERT/MISRA 规则映射到编译器告警与静态分析工具,可自动化大部分检查、减少人工成本。例如:-Wconversion 检测隐式类型转换(对应 INT31-C 等整型转换规则)、-Wnull-dereference 检测空指针解引用(对应 EXP34-C 等)、-fanalyzer(GCC 静态分析器)做路径分析检测越界、空指针、泄漏等。SonarQube 配置对应规则集(如 C/C++ 的 CERT、MISRA 规则),把规则映射到可执行的检查项,在 CI 中自动扫描。人工只需处理规则无法覆盖的复杂逻辑与豁免。

编译告警与静态分析把"人工翻规则"转为"自动扫描命中",极大降低执行成本。关键是建立规则↔检查项的映射表,让每条标准规则都有自动化落点。

#
★★

8. 功能安全标准的分级编码要求中 ISO 26262-6 按 ASIL 等级强制采用经认可的编码规范并配合静态分析(如 MISRA C 与 Helix QAC),DO-178C 对最高安全等级要求 MC/DC 结构覆盖,IEC 62304(医疗软件)要求软件单元验证,三者对工具资格认证与覆盖率证据的差异如何落地?

功能安全标准(ISO 26262-6、DO-178C、IEC 62304)的分级编码要求有何差异?如何落地工具资格认证与覆盖率证据?

  • ISO 26262-6 按 ASIL 分级强制编码规范与静态分析
  • DO-178C 对安全等级要求 MC/DC 覆盖
  • IEC 62304 软件单元验证

三个功能安全标准对编码与验证有不同要求:ISO 26262-6(汽车)按 ASIL 等级(A-D)强制采用经认可的编码规范(如 MISRA C)并配合静态分析(如 Helix QAC),ASIL 越高要求越严;DO-178C(航空)按安全等级(A-E)要求结构化覆盖,最高等级(DAL A)要求 MC/DC(Modified Condition/Decision Coverage)结构覆盖;IEC 62304(医疗软件)按安全等级要求软件单元验证与编码规范。落地差异:工具资格认证——高风险等级要求工具经认证(如 TCL 评估、工具误差检测),覆盖率证据——需提供覆盖率报告(语句、分支、MC/DC)作为合规证据,等级越高证据越严格。

三者共同点是"等级越高,编码规范、静态分析、覆盖率证据越严格",且工具需资格认证以保证证据可信。落地需建立与安全等级匹配的验证流程与证据链。

#

9. MISRA C 2012 Rule 11.x 系列(void* 与对象指针间的隐式转换)

MISRA C 2012 Rule 11.x 系列对 void* 与对象指针间的隐式转换有何要求?

  • Rule 11.x 禁止 void* 与对象指针隐式转换
  • 指针类型转换的安全性
  • 为什么需要显式转换

MISRA C 2012 Rule 11.x 系列限制 void* 与对象指针(对象、函数指针)之间的隐式转换,要求指针类型转换必须显式且合理。原因:void* 丢失了类型信息,隐式转换可能掩盖类型不匹配、对齐问题或错误的对象类型,导致未定义行为或类型混淆。规则要求:避免 void* 与对象指针隐式互转,必须显式转换并在转换前保证类型兼容,降低类型安全风险。

指针类型安全是 C 安全的关键。Rule 11.x 通过禁止隐式 void* 转换,强制程序员明确类型意图,防止类型混淆漏洞,同时配合 -Wconversion 等告警辅助检查。

#

10. MISRA C 2012 Rule 16.x(switch 标签终止、break、default)

MISRA C 2012 Rule 16.x 对 switch 语句的终止、break、default 有何要求?

  • Rule 16.x 要求 switch 分支必须以 break 终止
  • 禁止贯穿(fall-through)
  • default 子句的要求

MISRA C 2012 Rule 16.x 系列对 switch 语句提出要求:每个 case 分支必须以 break(或 return 等)终止,禁止发生贯穿(fall-through),避免意外执行后续分支;除非明确用例,switch 应包含 default 子句处理未预期值;相关规则还限制 switch 的表达式类型与 case 数量。这些要求防止逻辑错误——遗漏 break 导致执行错误分支,这是常见缺陷。

switch 的 fall-through 是经典逻辑错误源。Rule 16.x 强制 break 终止与 default 覆盖,使 switch 行为确定、可预期,配合编译器告警(-Wimplicit-fallthrough)辅助检查。

#

11. MISRA C 2023 的 Deviation Permit 机制中逐条申请、证据留存与架构师会签

MISRA C 2023 的 Deviation Permit 机制是什么?如何逐条申请、留存证据与架构师会签?

  • Deviation Permit 的定义与用途
  • 逐条申请与证据留存
  • 架构师会签与审批职责

MISRA C 2023 引入 Deviation Permit(偏差许可)机制,允许对特定规则违规在受控条件下申请豁免,避免"无法遵守就豁免"的随意性。流程:逐条申请——对每个违规点单独申请,说明违规原因、风险评估与替代控制;证据留存——记录违规位置、上下文、缓解措施与审批记录,形成可追溯证据;架构师会签——由架构师(或安全负责人)审批,确认豁免合理且风险可接受,并设定有效期与复审条件。机制保证偏差受控、可追溯、可审计。

Deviation Permit 平衡"严格遵守"与"现实豁免",把例外变成受控过程而非随意放行。证据留存支撑合规审计,会签保证责任的明确归属。

#

12. CERT C/C++ 规则在 LLVM/Clang、GCC、SonarQube 的覆盖矩阵

CERT C/C++ 规则在 LLVM/Clang、GCC、SonarQube 中的覆盖情况如何?

  • 各工具对 CERT 规则的覆盖
  • Clang 的 -W 告警与分析器
  • SonarQube 的规则集

CERT C/C++ 规则在工具中的覆盖不同:GCC 通过 -W 告警(如 -Wconversion、-Wnull-dereference、-fanalyzer)覆盖部分规则;Clang 通过 -W 告警与静态分析器(clang-tidy、clang-analyzer,还有 cert-* 检查)覆盖较多 CERT 规则;SonarQube 提供 C/C++ 的 CERT 规则集,覆盖大量规则并支持自定义。覆盖矩阵即"规则↔工具"映射表,标注每条规则由哪个工具、哪个检查项覆盖,用于安排自动化检查与识别人工补充的空白。

单一工具无法覆盖全部 CERT 规则,需组合(GCC/Clang 告警 + clang-tidy + SonarQube)并建覆盖矩阵,明确每规则的检查落点与空白,指导人工复审。

#

13. MISRA C 2012 在 Helix QAC、Coverity、CodeQL 的合规检查器

MISRA C 2012 在 Helix QAC、Coverity、CodeQL 中的合规检查情况如何?

  • 各工具对 MISRA C 的合规检查
  • Helix QAC 的 MISRA 专项支持
  • Coverity 与 CodeQL 的检查能力

Helix QAC 是汽车/安全领域常用的 MISRA C 合规检查器,提供完整的 MISRA C 2012 规则覆盖与合规报告,支持编码规范强制与偏差管理;Coverity(Coverity/Black Duck)提供 MISRA 规则集与深度缺陷检测,适合大型代码库;CodeQL(GitHub)通过查询语言支持 MISRA 相关规则,可自定义查询。三者都能做 MISRA 合规检查,差异在覆盖完整性、报告能力与集成方式:Helix QAC 最常用于功能安全合规,Coverity 兼顾缺陷检测,CodeQL 灵活可定制。

选型看是否需功能安全合规证据(Helix QAC 强)、深度缺陷(Coverity)、可定制查询(CodeQL)。合规工具需提供规则覆盖报告作为证据。

#

14. SEI CERT 跨语言编码规范体系中 CERT C++ Coding Standard 与 CERT Oracle Java Coding Standard 相比 CERT C 增加了哪些面向对象与并发维度(虚析构与资源管理、异常安全、数据竞争与原子操作),如何在 clang-tidy(cert-* 检查)与 SpotBugs(FindSecBugs)中启用对应规则集?

SEI CERT 跨语言编码规范体系相比 CERT C 增加了哪些面向对象与并发维度?如何启用对应规则集?

  • CERT C++ 与 CERT Java 增加的面向对象/并发维度
  • 虚析构、异常安全、数据竞争、原子操作
  • clang-tidy 的 cert-* 与 SpotBugs/FindSecBugs 启用

SEI CERT 体系覆盖多语言:CERT C++ Coding Standard 与 CERT Oracle Java Coding Standard 相比 CERT C 增加了面向对象与并发维度——C++ 增加虚析构与资源管理(多态对象需虚析构防泄漏)、异常安全(RAII、异常安全的资源处理)、数据竞争与原子操作(std::atomic 防数据竞争);Java 增加 GC 与并发工具(并发容器、原子类、线程安全)等。启用时:clang-tidy 用 -checks=cert-* 启用 CERT 规则检查(含并发与资源管理);Java 用 SpotBugs(配合 FindSecBugs 插件)启用安全规则集,检测常见安全缺陷。跨语言规范让编码标准在不同语言下统一安全基线。

面向对象/并发是 C++/Java 相对 C 新增的复杂维度,也是漏洞高发区。跨语言规范体系覆盖这些维度,通过 clang-tidy 与 SpotBugs 等工具落地为可执行检查。

#

15. 安全标准例外(deviation、waiver)的申请、审批、记录、过期流程

安全标准例外(deviation、waiver)的申请、审批、记录、过期流程是怎样的?

  • deviation 的申请与理由
  • 审批与记录
  • 过期与复审

安全标准例外(deviation/waiver)的完整流程:申请——开发者对无法遵守的规则提出例外申请,说明违规原因、风险评估与替代控制;审批——由指定的评审人/安全负责人(如架构师、安全委员会)审批,确认风险可接受;记录——将例外详情(位置、原因、审批人、有效期)记录到受控清单,保证可追溯;过期——例外设定有效期,到期后复审,若违规已消除则关闭,否则重新评估或续期。流程保证例外受控、有期限、可审计,避免例外无限期存在。

例外管理是"规则不可避免被违反"的现实处理。制度化例外流程防止"违规被随意豁免",通过审批、记录、过期复审保证安全标准的严肃性与持续性。

#

16. Compiler hardening flags(-fstack-protector、-D_FORTIFY_SOURCE、-pie)的工程启用

如何工程启用编译器加固标志(-fstack-protector、-D_FORTIFY_SOURCE、-pie)?

  • 各加固标志的作用
  • 破坏性缓冲区的防护原理
  • 工程启用与兼容性

编译器加固标志:-fstack-protector(及 -fstack-protector-strong/-all)在存在缓冲区时插入栈保护(canary),检测栈溢出并中止;-D_FORTIFY_SOURCE=2 启用运行时缓冲区崩溃检测(如对 strcpy、memcpy 等做边界检查);-pie 生成位置无关可执行文件,配合 ASLR 提升地址随机化。工程启用:在编译配置中统一加入这些标志,对全代码库构建;注意 -fstack-protector 有性能开销、-D_FORTIFY_SOURCE 需配合 -O 优化,-pie 需链接兼容,需在构建验证后启用。这些标志是"编译器级安全加固",是纵深防御的基础。

加固标志以较低成本显著提升抗利用能力(栈溢出、缓冲区溢出、地址随机化),是安全编译的标配。工程启用需在构建系统统一配置并验证兼容性与性能。

#

17. 编码标准的落地中检查清单与工具?

如何落地编码标准?检查清单与工具如何配合?

  • 编码标准落地的检查清单
  • 工具(静态分析、编译器、CI)的配合
  • 落地流程与闭环

编码标准落地需"检查清单+工具"配合:检查清单——将标准规则转化为可勾选的检查清单(按规则分类、等级标注),供评审与自检使用,明确"查什么、什么标准";工具——用静态分析(Clang、GCC、SonarQube、Helix QAC)、编译器告警、CI 门禁自动化执行检查,生成报告并阻断违规。落地流程:规则选型→工具配置→CI 集成→人工评审补充→例外管理→定期复审,形成闭环。工具做自动化广度覆盖,检查清单做人工判断与评审深度,两者结合保证落地。

纯靠人读规则不现实,纯靠工具又无法覆盖需判断的规则。检查清单指导人工、工具自动化执行,配合 CI 门禁与例外管理,实现编码标准的持续落地与可审计。