Debian保障C++代码安全的实践路线
一 基础环境与安全编码准则
二 编译器与链接器强化选项
| 阶段 | 选项 | 作用 |
|---|---|---|
| 编译 | -O2 | 合理优化,利于发现部分缺陷 |
| 编译 | -Wall -Wextra -Wformat -Wformat=2 -Wconversion -Wimplicit-fallthrough | 提升警告覆盖,减少格式化与隐式转换风险 |
| 编译 | -D_FORTIFY_SOURCE=3 | 增强对常见库函数的安全检查(需与库版本匹配) |
| 编译 | -D_GLIBCXX_ASSERTIONS | 启用标准库断言,辅助发现容器/迭代器误用 |
| 编译 | -fstrict-flex-arrays=3 | 更严格处理柔性数组成员 |
| 编译 | -fstack-clash-protection | 缓解栈 clash 攻击 |
| 编译 | -fstack-protector-strong | 强化栈溢出保护 |
| 编译 | -ftrivial-auto-var-init=zero | 自动变量零初始化,降低未初始化使用风险 |
| 链接 | -Wl,-z,relro -Wl,-z,now | 启用 RELRO 与立即绑定,降低 GOT 覆盖风险 |
| 链接 | -Wl,-z,noexecstack | 禁止栈执行 |
| 链接 | -Wl,-z,nodlopen | 禁止动态库加载(若业务不需 dlopen) |
| 位置无关 | 可执行文件:-fPIE -pie;共享库:-fPIC -shared | 与 ASLR 协同,提升运行时随机化效果 |
| 架构扩展 | x86_64: -fcf-protection=full;aarch64: -mbranch-protection=standard | 控制流保护(CFI/分支保护) |
三 静态与动态缺陷检测
四 构建与交付的安全实践