安全规则集合

重磅!《安全规则集合》正式发布 https://mp.weixin.qq.com/s/_AX2dOte7QKMYQg3UjN4bQ

safe-rules/c-cpp-rules.md at main · Qihoo360/safe-rules https://github.com/Qihoo360/safe-rules/blob/main/c-cpp-rules.md

C/C++安全规则集合 Version

Bjarne Stroustrup: “C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.

  针对C、C++语言,本文收录了409种需要重点关注的问题,可为制定编程规范提供依据,也可为代码审计以及相关培训提供指导意见,适用于桌面、服务端以及嵌入式等软件系统。
  每个问题对应一条规则,每条规则可直接作为规范条款或审计检查点,本文是适用于不同应用场景的规则集合,读者可根据自身需求从中选取某个子集作为规范或审计依据,从而提高软件产品的安全性。

规则说明

规则按如下主题分为15个类别:

  1. Security:敏感数据保护、攻击防御等问题
  2. Resource:资源分配、使用与回收
  3. Precompile:预处理指令、宏、注释等问题
  4. Global:全局及命名空间作用域相关问题
  5. Type:类型相关的设计与实现
  6. Declaration:声明
  7. Exception:异常
  8. Function:函数实现
  9. Control:流程控制
  10. Expression:表达式
  11. Literal:常量
  12. Cast:类型转换
  13. Buffer:缓冲区
  14. Pointer:指针
  15. Style:样式、风格等问题

每条规则包括:

  • 编号:规则在本文中的章节编号,以“R”开头,称为Section-ID
  • 名称:用简练的短语描述违反规则的状况,以“ID_”开头,称为Fault-ID
  • 标题:规则的定义
  • 说明:规则设立的原因、示例、违反规则的后果、改进建议、参照依据、参考资料等内容

当代码出现违反规则的情况时,可分为:

  • Error:可直接导致错误的问题
  • Warning:可导致错误或存在隐患的问题
  • Suspicious:代码的可疑形式
  • Suggestion:对提高代码质量的建议

规则的说明包含:

  • 示例:规则相关的示例代码,指明符合规则(Compliant)的和违反规则(Non-compliant)的情况
  • 相关:与当前规则有相关性的规则,可作为扩展阅读的线索
  • 依据:规则依照的ISO/IEC标准,C规则以ISO/IEC 9899:2011为主,C++规则以ISO/IEC 14882:2011为主
  • 配置:某些规则的对象可由用户指定,审计工具可以此为参照实现定制化功能
  • 参考:规则参考的其他规范条款,如C++ Core Guidelines、MISRA、CWE、SEI CERT等,也可作为扩展阅读的线索

规则的相关性分为:

  • 特化:设规则A的特殊情况需要由规则B阐明,称规则B是规则A的特化
  • 泛化:与特化相反,称规则A是规则B的泛化
  • 相交:设两个规则针对不同的问题,但在内容上有一定的交集,称这两个规则相交

规则以“标准名称:版本 章节编号(段落编号)-性质”的格式引用标准,如“ISO/IEC 14882:2011 5.6(4)-undefined”,表示引用C++11标准的第5章第6节第4段说明的具有undefined性质的问题。

其中“性质”分为:

  • undefined:一般指某种错误,使程序产生undefined behavior
  • unspecified:标准不作明确规定的情况,由编译器或环境自主定义,具有随意性
  • implementation defined:由实现定义,也是由编译器或环境自主定义,与unspecified不同,要求有明确的文档支持
  • deprecated:已过时或已废弃的用法

本文以ISO/IEC 9899:2011以及ISO/IEC 14882:2011为主要依据,兼顾C18、C++17以及历史标准,没有特殊说明的规则同时适用于C语言和C++语言,只适用于某一种语言的规则会另有说明。

规则选取

本文是适用于不同应用场景的规则集合,读者可选取适合自己需求的规则。

指出某种错误的规则,如有“不可”、“不应”等字样的规则应尽量被选取,有“禁用”等字样的规则可能只适用于某一场景,可酌情选取。

如果将本文作为培训内容,为了全面理解各种场景下存在的问题,应选取全部规则。

规则列表

1. Security

2. Resource

3. Precompile

4. Global

5. Type

6. Declaration

7. Exception

8. Function

9. Control

10. Expression

11. Literal

12. Cast

13. Buffer

14. Pointer

15. Style

C/C++安全规则集合 Version

Bjarne Stroustrup: “C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.

  针对C、C++语言,本文收录了409种需要重点关注的问题,可为制定编程规范提供依据,也可为代码审计以及相关培训提供指导意见,适用于桌面、服务端以及嵌入式等软件系统。
  每个问题对应一条规则,每条规则可直接作为规范条款或审计检查点,本文是适用于不同应用场景的规则集合,读者可根据自身需求从中选取某个子集作为规范或审计依据,从而提高软件产品的安全性。

规则说明

规则按如下主题分为15个类别:

  1. Security:敏感数据保护、攻击防御等问题
  2. Resource:资源分配、使用与回收
  3. Precompile:预处理指令、宏、注释等问题
  4. Global:全局及命名空间作用域相关问题
  5. Type:类型相关的设计与实现
  6. Declaration:声明
  7. Exception:异常
  8. Function:函数实现
  9. Control:流程控制
  10. Expression:表达式
  11. Literal:常量
  12. Cast:类型转换
  13. Buffer:缓冲区
  14. Pointer:指针
  15. Style:样式、风格等问题

每条规则包括:

  • 编号:规则在本文中的章节编号,以“R”开头,称为Section-ID
  • 名称:用简练的短语描述违反规则的状况,以“ID_”开头,称为Fault-ID
  • 标题:规则的定义
  • 说明:规则设立的原因、示例、违反规则的后果、改进建议、参照依据、参考资料等内容

当代码出现违反规则的情况时,可分为:

  • Error:可直接导致错误的问题
  • Warning:可导致错误或存在隐患的问题
  • Suspicious:代码的可疑形式
  • Suggestion:对提高代码质量的建议

规则的说明包含:

  • 示例:规则相关的示例代码,指明符合规则(Compliant)的和违反规则(Non-compliant)的情况
  • 相关:与当前规则有相关性的规则,可作为扩展阅读的线索
  • 依据:规则依照的ISO/IEC标准,C规则以ISO/IEC 9899:2011为主,C++规则以ISO/IEC 14882:2011为主
  • 配置:某些规则的对象可由用户指定,审计工具可以此为参照实现定制化功能
  • 参考:规则参考的其他规范条款,如C++ Core Guidelines、MISRA、CWE、SEI CERT等,也可作为扩展阅读的线索

规则的相关性分为:

  • 特化:设规则A的特殊情况需要由规则B阐明,称规则B是规则A的特化
  • 泛化:与特化相反,称规则A是规则B的泛化
  • 相交:设两个规则针对不同的问题,但在内容上有一定的交集,称这两个规则相交

规则以“标准名称:版本 章节编号(段落编号)-性质”的格式引用标准,如“ISO/IEC 14882:2011 5.6(4)-undefined”,表示引用C++11标准的第5章第6节第4段说明的具有undefined性质的问题。

其中“性质”分为:

  • undefined:一般指某种错误,使程序产生undefined behavior
  • unspecified:标准不作明确规定的情况,由编译器或环境自主定义,具有随意性
  • implementation defined:由实现定义,也是由编译器或环境自主定义,与unspecified不同,要求有明确的文档支持
  • deprecated:已过时或已废弃的用法

本文以ISO/IEC 9899:2011以及ISO/IEC 14882:2011为主要依据,兼顾C18、C++17以及历史标准,没有特殊说明的规则同时适用于C语言和C++语言,只适用于某一种语言的规则会另有说明。

规则选取

本文是适用于不同应用场景的规则集合,读者可选取适合自己需求的规则。

指出某种错误的规则,如有“不可”、“不应”等字样的规则应尽量被选取,有“禁用”等字样的规则可能只适用于某一场景,可酌情选取。

如果将本文作为培训内容,为了全面理解各种场景下存在的问题,应选取全部规则。

规则列表

1. Security

2. Resource

3. Precompile

4. Global

5. Type

6. Declaration

7. Exception

8. Function

9. Control

10. Expression

11. Literal

12. Cast

13. Buffer

14. Pointer

15. Style

原文地址:https://www.cnblogs.com/rsapaper/p/15681715.html