HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

【关于封装的那些事】 缺失封装,2021年腾讯Java高级面试题及答案

Java 程序员 后端

【嵌入式实验】,面试官必问的技术问题之一

Java 程序员 后端

【计算机网络 1】计算机网络概述,Java高级工程师进阶学习—Java热修复原理

Java 程序员 后端

一口气面试6家大厂,已拿5家offer,大厂没有你想象中的难

Java 程序员 后端

【SpringMVC笔记】Ajax 入门,springboot源码解读与原理分析

Java 程序员 后端

一份秀出新天际的SpringCloudAlibaba笔记,把微服务玩的出神入化

Java 程序员 后端

一年Java开发经验,阿里巴巴五面(已offer,java原理视频

Java 程序员 后端

【Spring框架03】DI依赖注入,spring菜鸟教程pdf

Java 程序员 后端

一文掌握大数据架构师需要具备的能力和格局,别再说你不会JVM性能监控和调优了

Java 程序员 后端

一文看透Java高并发:Synchronized锁的性质、原理及其缺陷

Java 程序员 后端

一文读懂 spring MVC 请求处理流程,Java开发新手入门教程

Java 程序员 后端

【备战秋招冲击大厂】Java面试题系列,你还没弄明白存储键值对

Java 程序员 后端

【数据结构与算法 10】算法的时间复杂度和空间复杂度

Java 程序员 后端

【白话设计模式】去哪儿网一面,java面试题刷题软件

Java 程序员 后端

【线程】,Java自学宝典pdf

Java 程序员 后端

一招搞定 Spring Boot 可视化监控!,java进阶教程云盘

Java 程序员 后端

一文带你了解Java并发中的锁优化,让你的代码运行效率翻倍

Java 程序员 后端

【被面试官吊打】从系统角度考虑性能优化,kafkajvm调优

Java 程序员 后端

一场哔哩哔哩Java开发面试之旅,分享面试经历及复习资料

Java 程序员 后端

一夜之间火爆GitHub的好文!!阿里资深架构师整理分享

Java 程序员 后端

一次完整的JVM NativeMemoryTracking 堆外内存泄露分析

Java 程序员 后端

【备战秋招冲击大厂】Java面试题系列(1),springboot入门程序

Java 程序员 后端

一文带你深扒ClassLoader内核,揭开它的神秘面纱

Java 程序员 后端

【初学入门Demo注解版】SpringBoot ,java面试大全下载

Java 程序员 后端

【并发编程】深入了解volatile,linux高级编程pdf

Java 程序员 后端

【大厂面经】我通过了某独角兽公司的魔鬼五面

Java 程序员 后端

【数据库实验】,java语言零基础自学

Java 程序员 后端

【源码分析设计模式 7】Integer中的享元模式

Java 程序员 后端

【线程】(1),java高级特性编程及实战pdf百度云

Java 程序员 后端

【网络信息安全】身份认证,hadoop环境搭建教程

Java 程序员 后端

一文彻底弄懂如何选择抽象类还是接口,linux基础入门知识

Java 程序员 后端

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