写点什么

扩展 LLVM 的 Checked C 使 C 语言的空间内存更安全

  • 2018-09-17
  • 本文字数:1108 字

    阅读完需:约 4 分钟

Checked C 是由 Microsoft Research 组织开发的开源、合作项目,它的目标是扩展C 语言,方便程序员写出更为可靠的程序,不会出现类似缓存溢出、越界内存访问以及不正确的类型转换等问题。Checked C 的代码可以和标准C 代码共存,方便移植。

即将在IEEE Cybersecurity Development Conference 2018 上发表的一篇文章中,研究员介绍了 Checked C 主要的功能和优势

Checked C 借鉴了许多之前 safe-C 的想法,但是二者有所不同,Checked C 的设计重点在允许增量转换的同时平衡控制、互操作以及高性能。

该语言非常重视向后兼容性,它引入了检查指针的概念,来保证静态和动态访问验证。Checked C 语言尤其重视内存访问的空间安全问题,这代表着指针在分配的内存中始终是解引用的。Checked C 的三个设计重点如下所示:

  • C 指针表示得到了保留,所以 Checked C 的内存层与 C 相同。这有助于现存 C 代码库和库的互操作性。

  • 显式指明分配给指针的内存块边界,降低了编译时和运行时的负担。

  • 检查区域和边界安全接口让 Checked C 和原来的 C 代码的混合变成可能。完全移植过的代码将放在称为检查区域的 sp 中,在其中每个指针的访问都不会受到空间内存异常的限制。检查过的代码可以访问不安全的遗留 C 代码,这将通过边界安全的注解实现,这些注解将会添加到未检查的代码参数、返回值、功能、记录类型和全局变量中。

Checked C 给 C 语言添加了两个新的指针类型,_Ptr 和 Array_ptr。前者专门用于解引用,而后者支持指针运算。在解引用之前,编译器将动态地保证这两类指针的有效性。下面的例子展示了如何定义使用两个 _Array_ptr参数的功能:

复制代码
void append(
_Array_ptr<char> dst : count(dst_count),
_Array_ptr<char> src : count(src_count),
size_t dst_count, size_t src_count)
{
_Dynamic_check(src_count <= dst_count);
for (size_t i = 0; i < src_count; i++) {
if (src[i] == ’\0’) {
break;
}
dst[i] = src[i];
}
}

在创建数组的时候,程序员可以使用 _Checked 关键字指定检查边界:

int buf _Checked[10]根据 Checked C 开发者所述,要让现有的 C 代码转换为使用检查指针和数组的代码需要很多代码变更工作,可能会影响大概 17.5% 行代码。为了加快进程,团队正在开发自动转换的工具。有趣的是,Checked C 部分形式化的特点可以保证任何违背空间安全的动作都将隔离在检查区域之外。今后这一方面的努力方向将扩展到动态大小数组上。

最后需要提出的是,初步基准测试显示,检查行为增加了平均 8.6% 的运行时间。Checked C 是作为 LLVM 的扩展实现的,可以点击这里下载。

查看英文原文 Checked C Extends LLVM to Bring Spatial Memory Safety to C

感谢冬雨对本文的审校。

2018-09-17 15:171171
用户头像

发布了 218 篇内容, 共 70.3 次阅读, 收获喜欢 76 次。

关注

评论

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

过节 劝你少喝酒(一)

三号无名指

产品经理训练营 Week4 作业(待完善)

Mai

【STM32】1.44寸TFT液晶屏显示字符、汉字和图片

AXYZdong

硬件 stm32 2月春节不断更

Electron 多进程方案

将儒

Electron 多进程

日记 2021年2月11日(周四)

Changing Lin

2月春节不断更

CNCF 2021年展望:外围有亮点,核心还有硬仗

杨明越

编写优雅Javascript代码的最佳实践

devpoint

js 纯函数

【LeetCode】数据流中的第 K 大元素Java题解

Albert

算法 LeetCode 2月春节不断更

前端冲刺必备指南-执行上下文/作用域链/闭包/一等公民

我是哪吒

面试 大前端 编程语言 2月春节不断更 二月春节不断更

程序员成长第七篇:面试中需要注意的事项

石云升

面试 招聘 2月春节不断更

香烟缭绕的岁末

ITCamel

Java反射--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本

JavaPub

Java 面试 反射 java反射 javapub

机器学习·笔记之:

Nydia

倒排索引 Inverted Indexes

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

香,聊聊TiDB的分布式事务模型

君哥聊技术

分布式数据库 TiDB Percolator

前端冲刺必备指南-HTTP/HTTPS/HTTP2/DNS/TCP/经典题

我是哪吒

学习 程序员 面试 大前端 2月春节不断更

产品训练营-第四次作业

Geek_娴子

第四次作业及总结

青葵

学习

产品经理训练营第四次作业

庞玉坤

牛年到 春节快乐

小马哥

2021年展望

产品经理训练营第四周作业

产品经理训练营

6. Python 元组,不可变的列表,滚雪球学 Python

梦想橡皮擦

Python 2月春节不断更 python入门

给自己的新年指南

boshi

七日更 新年

程序员成长第六篇:如何选择公司?

石云升

职业发展 2月春节不断更 选择公司

产品经理训练营 - 第四次作业

Jophie

产品经理训练营

LeetCode题解:297. 二叉树的序列化与反序列化,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

产品经理训练营-第四周作业

羽室

业务中台建设 - C端用户中心

孝鹏

中台架构 用户

从文字中找回年味儿

熊斌

2月春节不断更

机器学习·笔记之:inverse and transpose

Nydia

一个人的春节,也要过得开心

程序员架构进阶

个人感悟 七日更 2月春节不断更

扩展LLVM的Checked C使C语言的空间内存更安全_语言 & 开发_Sergio De Simone_InfoQ精选文章