写点什么

扩展 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:171546
用户头像

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

关注

评论

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

上一任留下的 Eureka,我该如何提升她的性能和稳定性(含数据比对)?

阿里巴巴云原生

阿里云 微服务 云原生

产品经理需要掌握哪些技能?一文弄懂PM的方方面面!附知识图谱

彭宏豪95

产品经理 产品设计 PM 在线白板 团队协同

在线 cURL 参数对比工具,让你的开发工作更加高效

秦少卫

curl 接口工具 调试工具 请求参数对比 参数格式化

Programming Abstractions in C阅读笔记:p254-p257

codists

传统外贸和代购独立站的区别

tbapi

传统外贸 外贸独立站

手把手系列!无需 OpenAI 即可搭建 RAG 应用

Zilliz

Milvus openai AIGC LLM rag

一文详解全栈可观测的实现路径

阿里巴巴云原生

阿里云 云原生 可观测

据说这道Go面试题90%的人都搞错了!

王中阳Go

面试题 面经 defer Go 语言 断点

上市难不上市更难,谁能佐证中国企服的光明前途?

ToB行业头条

【豆瓣8.4】《RabbitMQ实战指南》PDF

程序员李木子

【豆瓣9.1】《大数据处理框架Apache Spark设计与实现(全彩)》PDF

程序员李木子

选择海外云手机需要考虑什么?

Ogcloud

云手机 海外云手机 云手机海外版

小红书如何做混部?

阿里巴巴云原生

阿里云 云原生 Koordinator

【完整版教程】iOS混淆加固原理篇

秒级响应,显著增效:明日控股携手奇点云,打造大宗贸易的数据中台标杆

极客天地

Nop入门:极简服务层开发

canonical

gRPC 低代码 graphql SpringBoot3

听GPT 讲Rust源代码--compiler(30)

fliter

Nop入门:极简数据访问层开发

canonical

mybatis 低代码 ORM graphql

C# 面向对象编程解析:优势、类和对象、类成员详解

小万哥

C# 程序人生 编程语言 软件工程 后端开发

2023 IoTDB Summit:昆仑智汇数据科技(北京)有限公司董事长陆薇《IoTDB在先进制造领域数据资源管理运营的应用》

Apache IoTDB

DAPP合约代币质押流动性挖矿系统开发丨源码丨技术设计

l8l259l3365

从 Greenplum 到 Databend,万全网络数据库平台架构演进

Databend

数据库迁移

物流快递电子面单对接规则指南

快递鸟

电子面单

2024年首期OpenHarmony繁星计划师资培训在东莞圆满举办

新消费日报

【新手视频】在线快速搭建AI原生应用

AI大咚咚

百度 AI rag AI原生应用 Agent构建

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