概述

目标和适用范围

本规范参考业界标准及实践,华为编程实践总结,为提高代码的可读性,可维护性和安全性,提供编程指南,力争系统化、易使用、易检查。

本规范适用于公司内使用仓颉编程语言编写的代码。

本规范不是仓颉语言教程,在参考本规范之前,希望您具有相应的仓颉语言基础知识。

总体原则

仓颉编程遵循通用原则:

  1. 清晰第一:清晰性是易于维护、易于重构的程序必需具备的特征。
  2. 简洁为美:简洁就是易于理解并且易于实现。
  3. 风格一致:相比个人习惯,所有人共享同一种风格带来的好处,远远超出为统一而付出的代价。

安全编码基本思想:

编程过程中应该时刻保持以下的假设:

  1. 程序所处理的所有外部数据都是不可信的攻击数据
  2. 攻击者时刻试图监听、篡改、破坏程序运行环境、外部数据

基于以上的假设,得出安全编码基本思想:

  1. 程序在处理外部数据时必须经过严格的合法性校验 编程人员在处理外部数据过程中必须时刻保持这种思维意识,不能做出任何外部数据符合预期的假设,外部数据必须经过严格判断后才能使用。编码人员必须在这种严酷的攻击环境下通过遵守这一原则保证程序的执行过程符合预期结果。

  2. 尽量减少代码的攻击面。代码的实现应该尽量简单,避免与外部环境做多余的数据交互,过多的攻击面增加了被攻击的概率,尽量避免将程序内部的数据处理过程暴露到外部环境。

  3. 通过防御性的编码策略来弥补潜在的编码人员的疏忽 粗心是人类的天性。由于外部环境的不确定性,以及编码人员的经验、习惯的差异,代码的执行过程很难达到完全符合预期设想的情况。因此在编码过程中必须采取防御性的策略,尽量缓解由于编码人员疏忽导致的缺陷。

条款组织方式

每个条款一般包含标题、级别、描述等组成部分。条款内容中的 “正例”表示符合该条款要求的代码片段,“反例”表示不符合该条款要求的代码片段,但不一定造成程序错误的结果。

标题

描述本条款的内容。

规范条款分为原则和规则两个类别,原则可以评价规则内容制定的好坏并引导规则进行相应的调整;规则是需要遵从或参考的实践。通过标题前的编号标识出条款的类别为原则或规则。

标题前的编号规则为:'P' 为单词 Principle 首字母,'G' 为单词 Guideline 的首字母。原则条款的编号规则为 P.Number。规则的编号方式为 G.Element.Number,其中 Element 为领域知识中关键元素(本规范中对应的二级目录)的 3 位英文字母缩略语。Number 是从 1 开始递增的两位阿拉伯数字,不足两位时高位补 0。

级别

规则类条款分为两个级别:要求、建议。

  • 要求:表示产品原则上应该遵从,但可以按照具体的产品版本计划和节奏分期实现。
  • 建议:表示该条款属于最佳实践,有助于进一步消解风险,产品可结合业务情况考虑是否纳入,但要保证实施一致的代码风格。

描述

对条款的进一步描述,描述条款的原理,配合正确和错误的代码例子作为示范。有的条款还包含一些规则不适用的例外场景。

仓颉语言的安全机制

仓颉提供了很多安全机制来减少潜在的安全风险:

  • 类型安全:仓颉语言是静态强类型语言,通过编译时检查尽早发现程序错误,排除运行时类型错误,能够减少整数截断、溢出、回绕的问题,同时仅非常有限地支持隐式转换。
  • 自动内存管理:仓颉语言采用垃圾收集机制,支持自动内存管理,杜绝内存泄漏、多次释放等问题。
  • 内存安全:仓颉语言在运行时进行数组下标越界检查、溢出检查等,确保程序内存安全。
  • 无指针:仓颉语言支持枚举类型,使用由枚举类型定义的 Option 类型解决了空指针问题。同时不能对对象取地址,引用类型不能使用指针的算术运算,所以无法创造出野指针。
  • 变量初始化策略:仓颉语言要求所有变量都必须初始化,并且在编译时进行检查,减少忘记赋值导致的安全风险。

仓颉在实现了上述强大的安全机制的同时,也实现了强大的兼容性:仓颉语言通过在 IR 层级上实现多语言的互通,可以高效调用其他主流编程语言,进而实现对其他语言库的复用和生态兼容。但由于仓颉的提供的安全机制仅适用于仓颉语言本身,并不适用于与其他语言交互操作的场景,因此与其他语言交互操作的安全规范请参考语言互操作章节。