10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

Checked C —— 微软发布让 C/C++ 更加安全的库

2016 年 6 月 21 日

微软开源了 Checked C ,一个旨在对 C 和 C++ 增加边界检查的研究项目。

C 和 C++ 语言上最大的漏洞之一可能就是越界的内存访问。根据美国国家标准技术研究所的国家漏洞数据库数据,从2010 年至2015 年,缓冲区溢出占所有安全漏洞的10-16%。由于大部分系统软件(操作系统、数据库、编译器、解释器、浏览器等)都使用C 和C++ 两种语言之一编写,许多系统都面临内存冲突问题,这使得它们面临故障或者受到攻击,导致隐私信息泄露和系统被控制。来自微软和马里兰大学的一群研究者正在尝试解决这些问题,实现了 Checked C ,它是一个 C 语言的扩展和 C++ 语言的子集,为这些语言增加边界检查。

不像现代语言(如 Java、C#)这些自带自动边界检测,将该功能加入到 C 语言非常困难,项目参与者、微软研究员 David Tarditi 解释道:

为 C 语言增加边界检查有两个障碍。第一是运行时边界信息的存放位置,第二是如何高效的进行边界检查。在实践中发现,改变所有 C 语言指针类型和数组,以携带边界信息不是一个有效的方案。C 语言可能被用于系统基础,一些硬件和标准指定了数据布局,且数据布局无法改变。同时 C 程序还与现存的操作系统交互,这些软件都需要特定的数据布局。

Checked C 允许程序员在 C/C++ 中编写“确保边界检查”的代码。为了实现这个功能 Checked C 增加了新的指针和数组类型,它们可以在编译期和运行时进行边界检查:

  • ptr:指向类型 T 且无须边界检查的指针。这种类型的指针不允许参与算数运算。当访问内存时,该类型指针不能为 null。大部分指针应该用此类型。
  • array_ptr:指向包含类型 T 数组的指针。该指针可以进行算数运算。当读写内存时它不能为 null。程序员需要检查这类指针的边界。
  • span:包含边界信息的指针。塔支持算数运算。当进行内存读写的时候不能为 null。
  • T array_var checked[100]:声明类型为 T、大小为 100 的数组并且包含边界检查。当进行 C 语言类型转换时,包含边界检查的数组将被转换成 array_ptr 类型。

该规范确定了变量操作行为,包括指针类型的间接寻址、数组引用、赋值、指针加法、比较、取址(&)、含边界检查数组类型和指针类型的转换等。

现存的 C 程序可以继续工作,很明显 C* 仍然未检查,且指针的算数运算会破坏当前代码。但是编译器可以通过增加参数在指针非正常使用时发出警告或者错误。

Checked C在GitHub 上开源,包含规范、一个 clang 的实现和一个 LLVM 的实现。对此项目感兴趣的开发者被邀请参与项目,即可以改进规范、提出新的功能例如类型转换或者内存管理、增加测试,也可以扩展其他编译器对Checked C 的支持。

过去也有其他尝试对C 语言增加边界检查,包括使用静态分析、增强编译器或者运行时以避免修改语言本身、程序验证或者创造基于C 的新语言。规范的第九章“相关工作”包含了这些其他实现的细节,并且解释了为什么作者选择了扩展语言。

查看英文原文 Checked C - A Safer C/C++ from Microsoft


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016 年 6 月 21 日 19:002171

评论

发布
暂无评论
发现更多内容

IO多路复用整理

戈坞昂

Linux io

【摘】Git-从零单排 01期

卡尔

git 效率工具 工具 开发工具

写给产品经理的信(3):抗压能力需要多强?

punkboy

生涯规划 产品经理 进阶 压力 工作方式

回“疫”录(25):被颜色攻占的地方

小天同学

疫情 回忆录 现实纪录 纪实

1分钟学习Java中数组快速复制

HQ数字卡

Java 数组

Android实现人脸识别(人脸检测)初识

sar

android OpenCV renlianshibie

团队快速扩张时期的组织架构演进

Skipper

团队管理 团队协作 团队 团队组织

mac 安装特定版本php-redis

HQ数字卡

php

ARTS - 第一周打卡

陈文昕

记:mybatis <foreach> 语法错误

Kevin Liao

mybatis foreach SQL语法 SQLSyntaxErrorException

Git内部原理介绍

戈坞昂

git

一文道尽 Excel 的 Criterion

张利东

Excel

重磅!Apache Flink 1.11 功能前瞻抢先看!

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

浅谈使命、愿景、价值观。

石云升

价值观 使命 愿景

使用docker-compose部署单机RabbitMQ

Kevin Liao

Docker Docker-compose RabbitMQ

《零基础学 Java》 FAQ 之 16-范型引用的通配符再解

臧萌

Java

程序员如何阅读英文资料

brave heart

学习

IDEA 插件开发实战

李孟

Java 工具 IDEA 插件 idea插件

MySQL查询优化一般步骤

HQ数字卡

MySQL sql 查询优化

JAVA AGENT 学习

zane

Java

OpenResty 部署配置和日志切割

wong

centos log openresty

《零基础学 Java》 FAQ 之 14-访问控制符总结

臧萌

Java

RestTemplate 配置手册

zane

Spring Boot HTTP

唯技术论坏处都有啥?如何跳出唯技术论思维?

KAMI

方法论 思考 思维方式 开发 唯技术论

介绍一款文本分析工具

黄大路

数据挖掘 数据分析 nlp

《零基础学 Java》 FAQ 之 15-Java范型做了两件事

臧萌

Java

zabbix实战指南(1)

橙子冰

zabbix

全栈工程师为什么越混越困难,看这篇就够了

金刚小书童

程序员 职业规划 技术管理 全栈工程师

"第1天,读以太坊白皮书 | 5天掌握以太坊 dApp 开发"

陈东泽 EuryChen

区块链 以太坊 dapp Ethereum blockchain

《零基础学 Java》 FAQ 之 13-编程里的两个特殊的值

臧萌

Java

机器学习-有监督学习入门

第519区

学习 产品经理

Checked C —— 微软发布让C/C++更加安全的库-InfoQ