C++之父做决定了:内部自救!

2023-05-16

进入2023年,技术圈都在围观大洋彼岸的聊天机器ChatGPT,但对于编程圈而言,没有什么比内存安全更能引起热议。近期美国国家安全局(NSA)点名批评C++,建议使用Rust等内存安全的语言,霎时间让“编程语言的安全问题”摆到桌面上,那么,C++到底能扛住这波压力,“存活(安全)”下来吗?

面对来自政府方面的压力,C++创建者Bjarne Stroustrup最终还是低头了。他一改之前的激奋言辞,不再喊话“谁谁不懂C++”、“没有看到30多年来C++的进步”等,而是开始倾向于“编程语言也应该与时俱进”的说辞,加入了改变编程语言本身以解决安全问题的队伍之中,这一点对其他核心贡献者来说显然出乎意料。

安全掉队的C++,正在找对策

C++社区一直存在安全争议,其内存安全漏洞引起了很多开发者的警觉。

1月中旬,官方C++“指导小组”发布了一份声明,解决了人们对C++安全性的担忧。虽然许多语言现在都支持“基本类型安全”,即确保变量只访问由其数据类型明确定义的内存部分,但C++一直难以提供类似的保证。

这个由C++创建者Bjarne Stroustrup共同撰写的新声明现在似乎呼吁改变C++编程语言本身,以解决安全问题。“我们现在支持这样的想法,即安全性的更改不仅需要在工具中,而且需要在语言/编译器和库中可见。”

“指导小组”还支持其长期以来首选的调试工具,以确保安全(以及“推动工具,以便在识别人类难以识别的安全问题时进行更全面的分析”)。但1月份的声明强调了它对C++内部变化的建议

具体来说,它建议“将几个特性打包到概要文件中”(概要文件稍后定义为“定义要执行的属性的限制和要求的集合”,例如,通过触发自动分析。)

这样,新的安全更改“应该是可见的,这样安全代码部分就可以被命名(可能使用配置文件),并且可以与普通代码混合。”

这种新方法最终不仅带来了安全性,还带来了灵活性,其配置文件专门设计用于支持嵌入式计算、性能敏感应用程序或高度特定的问题领域,如汽车、航空航天、航空电子、核或医疗应用程序。

指导小组还建议:“例如,我们甚至可能有安全嵌入式、安全汽车、安全医疗、性能游戏、性能HPC和欧盟政府法规的安全配置文件。”。

在文件的其他地方,他们的表述更为简洁。“为了支持不止一个‘安全’概念,我们需要能够说出它们的名字。”

但提议的改变与去年12月与美联邦政府摊牌时出现的想法相呼应。1月中旬的声明指出,一个特别重要的组织,即美国商务部颇具影响力的国家标准与技术研究所,对C++的安全性提出了担忧。11月,美国国家安全局(National Security Agency)也在一份关于软件内存安全的信息表中调用了C++(作为其任务的一部分,以识别对各种联邦系统的威胁,并“发布网络安全规范和缓解措施”)。

也许正是这种来自高层的担忧最终埋下了变革的种子…

国家安全问题

美国国家安全局援引了微软和谷歌的分析评估。

微软在2019年的一次会议上透露,从2006年到2018年,其发现的70%的漏洞都是因内存安全问题造成的;据Google估计,Chrome中存在了类似比例的内存安全漏洞,另外90%的Android系统漏洞也都是内存安全问题。

他们随后警告称,黑客可以利用这些漏洞进行远程代码执行或其他不利影响,这通常会危及设备,并且成为大规模网络入侵的第一步。因此,无论是内存溢出、内存分配漏洞、还是变量未初始化,“所有这些内存问题都太常见了。”

显然,软件分析工具和“操作环境选项”可以发现许多问题,但美国国家安全局仍然建议,“在可能的情况下”,只使用内存安全语言。

为了明确起见,他们将其定义为一种语言,通过运行时和编译时检查,内存“作为计算机语言的一部分自动管理;它不依赖于程序员添加代码来实现内存保护。”NSA提供了C#、Go、Java、Ruby、Rust和Swift等示例。

在美国国家安全局看来,常用的编程语言如C++,在内存管理方面提供了很大的灵活性,但用这种语言开发的应用程序的安全性很大程度上需要依赖程序员的检测环节。但是只要程序员自身有所疏忽,就可能带来严重的内存安全隐患。尽管不少软件分析工具能够检测到内存管理问题,操作环境选项也可以提供一些防护,但内存安全语言所提供的固有保护可以规避或减轻大多数内存管理问题。

去年12月,Stroustrup在开放标准网站上回应称,他并不认为这些语言“在我所关心的使用范围内”优于C++。

Stroustrup还反对美国国家安全局对安全的讨论“仅限于内存安全,而忽略了一种语言可能(并且将会)被用来违反某种形式的安全和保障的十几种其他方式……‘安全’的定义不止一种,我们可以通过编程风格、支持库和通过静态分析执行的组合来实现各种安全。”

在这一过程中,Stroustrup还提出了第二个论点:在一些性能至关重要的现实场景中,“并非所有人都将‘安全’放在首位。”因此Stroustrup认为,“明智”的做法是列出安全问题(包括未定义的行为),然后根据需要使用预执行调试工具(如静态分析器)找到防止这些问题的方法。

沿着这些路线,Stroustrup已经在为C++调用编译器选项和代码注释,以请求类型安全(和资源安全),说这“让你只在需要的地方应用安全保证,并在需要的地方使用你最喜欢的调优技术…”

新提出的“配置文件”似乎是实现这一目标的一种语言方式。

理性看待C++的安全性

Stroustrup还反对在美国安全局的文件中将C++与C混为一谈。他指出,即使是现在,“C++核心指南也专门致力于为那些需要的人提供静态保证的类型安全和资源安全,而不会破坏代码库,因为这些代码库可以在没有这种强有力的保证或引入额外的工具链的情况下进行管理。”

微软的Visual Studio分析器(及其内存安全配置文件)以及许多静态分析器已经支持这些核心准则。Stroustrup认为,这种方法允许C++“完全实现这些保证,而花费的成本只是转向各种新颖的‘安全’语言的一小部分”。

Stroustrup还引用了他在2021年写的另一篇论文,该论文指出:“从1979年开始,完全的类型和资源安全就一直是C++的理想(目标),并且可以通过语言规则和静态分析强制执行的明智编程技术实现。”(后来Stroustrup写道,解决方案是“一套精心设计的编程规则,由库设施支持,并由静态分析强制执行”。)

论文承认,就其本身而言,“默认情况下,核心指南不提供完整的类型和资源安全”——但认为它可以通过实施额外的规则来保证(例如,“由微软Visual Studio发布的核心指南检查器实现”)。Stroustrup对Rust基于编译器的类型检查表示认可,他写道:“编译器不是我们唯一的工具,从来都不是”,并提供了(预编译)静态分析可以执行的强大检查的具体示例。例如,静态分析可以:

  • 防止不安全的类型转换

  • 防止创建未初始化的对象

  • 确保没有内存引用指针“转义”超出其狭窄定义的范围而错误地指向其他对象

在去年12月对美国安全据的回应中,Stroustrup写道,我们生活在一个“数十亿行C++代码不会神奇消失”的世界里,并补充说,逐渐采用这些安全规则(以及在适当的情况下采用不同的安全规则)是很重要的。

在某种程度上,美国国家安全局的论文似乎同意其中的一些观点。其文件包括了关于“强化”用非内存安全语言编写的代码的技巧,推荐了用于静态分析(检查源代码)和动态分析(在代码执行时执行)的工具,以及简化结果的漏洞相关工具。“解决这些工具发现的问题可能需要大量的工作,但会产生更健壮和安全的代码。”

美国国家安全局的文件确实提到了“对非内存安全语言使用附加保护”所提供的“相当大的保护”。(它还建议通过控制流保护、地址空间布局随机化和数据执行预防等安全功能强化编译和执行环境。)

忆往昔,C++做长期主义者

在Honeypot的《不为人知的开发者故事》(Untold Developer Stories)的一次新采访中,72岁的Stroustrup回顾了自己的学生时代,当他还是个年轻人时,获得了获得了数学和计算机科学硕士学位的他发现自己的数学不如想象中那么好,但“机器架构真的很有趣”。

当被问及,如果有时间机器可以让他回到最初创建C++的时候,他最想改变的东西是什么?Bjarne说,现在的他不会比创建C++时的那个他更了解那个时代,他做的任何改动可能都无法适应那个内存只有1MB的工作环境,也没法编译到早期的640MB Windows电脑上。

“编程语言设计的有趣之处在于,如果你成功了,你就拥有了多年前和几十年前所做的一切,你必须忍受它。一旦你得到了用户,你就有责任,其中一个责任就是不破坏他们的代码……有数千亿行C++代码,我们无法破坏它们。”

Stroustrup强调了他对C++的信心。“我认为C++可以做Rust可以做的任何事情,我希望它使用起来简单得多。”但他在2020年的采访中也表示,基本类型安全——确保变量只能访问其清晰划分的内存块——是他最早的设计目标之一,也是他花了几十年时间试图实现的目标。

没有时间机器,一切犹如开始

这位年逾古稀的C++创建者,此时虽然已经恢复信心,但对于评论者的言论有些小难过,“当我听到人们在谈论C++时,这些人就好似回到八九十年代那样(指指点点)。”

但正如前文所述,世间没有时间机器,C++的设计理念也要随着所处的时代一路演进。

C++在诞生近四十年后,依然保持着强大的生命力。Stroustrup认为保持其稳定性,并追求渐进式进化是必要的。

“我从一开始就知道,我不可能构建理想的语言,因此我必须以渐进式发展为目标:改进。说真的,我并不相信完美语言的构想:要怎样就算是完美呢?对谁来说(是完美的)?”他补充说:“为了应对不断变化的世界的挑战,融入新思想,改进是必须的。”


学习交流企鹅群;763855696 公众号:奇牛编程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之父做决定了:内部自救! 的相关文章

  • 六、Echart图表 之 tooltip提示框组件配置项大全

    x1f353 作者主页 xff1a x1f496 仙女不下凡 x1f496 x1f353 前言介绍 xff1a 以下 x1f447 内容是我个人对于该技术的总结 xff0c 如有不足与错误敬请指正 xff01 x1f353 欢迎点赞 x1f
  • 常用方法——9.js中无区别分割中英文逗号的字符串成为数组

    x1f348 作者主页 xff1a x1f496 仙女不下凡 x1f496 x1f348 前言介绍 xff1a 以下 x1f447 内容都是我个人对于前端知识的总结 xff0c 会定期更新欢迎持续关注 xff01 x1f348 欢迎点赞 x
  • 6.常见报错-已解决:v-on event ‘@showSizeChange‘ must be hyphenated

    x1f33a 作者主页 xff1a x1f331 仙女不下凡 x1f331 x1f33a 欢迎点赞 x1f44d 收藏 留言 x1f4dd 如有错误敬请指正 xff01 v span class token operator span on
  • 记录·linux系统中硬盘的挂载与格式化

    一 首先为虚拟机添加新硬盘 xff1a 1 单击 硬盘 开始进行硬盘的添加 xff1a 这时新添加的硬盘还不能用 xff0c 我们还需继续进行对磁盘的第二个步骤 xff1a 分区 二 磁盘的分区 1 这时我们需使用 lsblk 命令 xff
  • 记录 · linux系统创建RAID

    目标需求 xff1a 创建RAID卷设备名为md127 级别5 xff0c 使用2个硬盘建立RAID 1个硬盘作为热备份 并创建成ext3系统文件 xff0c 最后挂载到 mnt md127 一 说明 一般创建RAID卷有两种方法 xff0
  • 记录 · Samba服务部署

    Samba 服务器可以使用户在异构网络操作系统之间进行文件共享 Samba 服务器提供了在Windows 环境下共享 Linux 中用户目录的一个工具 在Linux 中安装Samba 后 xff0c Windows 用户只需进行简单的用户登
  • ROS如何创建一个发布者Publisher

    1 创建工作环境 首先我们需要在主文件夹创建功能包 先创建一个文件夹 mkdir catkin ws cd catkin ws mkdir src catkin ws为我们文件夹的名称 添加工程包需要的依赖 cd catkin ws src
  • C++书籍推荐(小白变大牛最全书单)

    一 C 43 43 书籍推荐之手册类 xff08 适用所有级别 xff09 可以关注博主的微 信 公 众 号 xff1a C和C加加 回复 88 即可领取相关电子书和C 43 43 教程大全 1 C 43 43 程序设计语言 The C 4
  • 最新C语言编程软件推荐(2021整理)

    一 C语言编程软件推荐 C语言编程软件适于编写系统软件 xff0c 是学习编程的同学们的必备软件 c语言一种应用非常广泛的编程语言 xff0c 不仅仅是在软件开发上 xff0c 而且各类科研都会用到c语言 今天小编给大家汇总下C语言的编程软
  • Jmeter性能测试(4)---HTTP请求详解

    jmeter xff08 四 xff09 HTTP请求 启动jmeter xff0c 建立一个测试计划 启动 xff1a 打开jmeter文件夹 xff0c bin文件 jmeter bat xff08 Windows执行文件 xff09
  • C语言和C++的区别和联系

    C语言虽说经常和C 43 43 在一起被大家提起 xff0c 但可千万不要以为它们是一种编程语言 我们来介绍C语言和C 43 43 中的区别和联系 首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是
  • 字符串的定义及何时添加‘\0‘问题

    定义字符串的六种形式 xff1a char arr 61 34 hello world 34 原理 xff1a 字符串常量的值本质上是第一个字符的地址 char arr arr 61 34 hello world 34 的改写 char a
  • 什么是云技术?

    云技术是指在广域网或局域网内将硬件 软件 网络等系列资源统一起来 xff0c 实现数据的计算 储存 处理和共享的一种托管技术
  • 深度学习神经网络归一化方法及MATLAB函数

    归一化方法及 MATLAB函数 数据归一化方法是神经网络预测前对数据常做的一种处理方法 数据归一化处理把所有数据都转化为 xff3b 0 xff0c 1 xff3d 之间的数 xff0c 其目的是取消各维数据间数量级差别 xff0c 避免因
  • 2022数模国赛B题无人机第一题第一小问的简单编程

    前言 2022年国赛B题是关于无人机定位的抽象模型 xff0c 总体难度不大 接下来简单介绍一下第一题第一小问的程序实现 xff0c 当时国赛仓促 xff0c 写的比较简略 xff0c 仅供参考 背景介绍 无源定位 第一个关键词是无源定位
  • Linux基础之网络编程

    网络编程篇 一 网络编程概述二 字节序三 socket编程步骤四 socket服务端和客户端代码的初步实现五 简单的ftp项目实现的功能有哪些 xff1f 六 ftp项目服务器和客户端代码实现 一 网络编程概述 1 进程间通信 xff1a
  • F450无人机组装与调试

    文章目录 认识无人机零部件机架图片 电机电调螺旋桨飞控套件 包括飞控 LED信号灯 xff0c GPS模块 xff0c 电源管理模块 遥控器及遥控器接收机电池护桨 确认工具清单组装过程1 组装机架2 组装电机判断电机正反选择螺丝组装电机连接
  • Openstack-mitaka安装部署

    openstack 一台controller xff0c 一台compute 且两台均为双网卡 xff0c ens33为主网卡 xff0c ens36不需要配置IP 主机名称 网卡名称 网卡类型 网卡IP ens33 controllere
  • Vue history模式路由 部署到二级目录 配置

    1 nginx配置 https xxxx com cms gt C static server cms location cms root C static server 项目部署资源所在磁盘目录 index index html try
  • 【Docker】将本地镜像推送到远程库/私有库

    前言 这里记录如何将本地镜像推送到远程库和私有库 区别 xff0c 一个是存放到阿里云 xff0c 同一个团队可以登录到同一个阿里云仓库 xff0c 去拉取镜像 一个是存放到本地私有库 xff0c 同一个团队可以连接同一个私有库 xff0c

随机推荐

  • HTTP协议--几种数据传输方式

    1 xff09 无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议 xff0c 即无状态协议 这种设置的好处是 xff1a 更快的处理更多的请求事务 xff0c 确保协议的可伸缩性 不过随着web的不断发展 xff0c
  • PDU 超链接

    http blog sina com cn s blog 453226290102wvnu html http blog sina com cn s blog 453226290102wvnv html http blog sina com
  • Canal监控MySQL数据到Kafka详细步骤(jdk+zookeeper+kafka+canal+mysql)

    目录 一 前言二 环境准备三 安装JDK四 安装zookeeper五 安装Kafka六 安装MySQL七 安装canal服务端 xff08 canal监控mysql数据发送到kafka xff09 八 测试是否可以监控到数据九 结语 一 前
  • 流媒体服务器搭建

    本文介绍如何在阿里云 腾讯云等云主机上搭建流媒体服务器 xff0c 包括如何选择云主机配置 如何选择带宽和流媒体服务器软件选择等 流媒体服务器是支撑视频播出的基础系统 xff0c 具有视频直播 视频点播的播出能力 xff0c 有些使用场景下
  • 什么是BGP

    文章目录 1 基本概念什么是BGPBGP路由协议的特点IBGP水平分割规则BGP的路由器号 Router ID BGP工作原理BGP分类 1 基本概念 自治系统 xff0c 指的是在同一个组织管理下 使用相同策略的设备的集合 xff1b 不
  • Web服务------Nginx域名重定向(Location匹配与Rewrite重写)

    目录 一 常用的Nginx正则表达式二 location1 location 的分类2 location 常用的匹配规则3 location 优先级4 location 示例说明5 优先级总结6 匹配规则 二 rewrite1 rewrit
  • 华为云-计算云服务介绍

    前言 相信很多小伙伴在刚开始接触各类云产品的时候 xff0c 被各种各样的云产品类如规格 型号 价格 适用场景等问题所困扰 本文就给大家介绍一下华为云常见云产品的规格区别和适用场景 帮助大家选择合适的云产品 文章目录 前言一 计算云服务1
  • 数据资源 | 八大板块!数据公开下载渠道

    本文综合整理自网站企研 中国学术大数据平台 xff08 https r qiyandata com xff09 来源 xff1a 企研 中国学术大数据平台 公共数据资源 目录 三农 地理信息 生态环境 碳中和 调查数据 省级统计局 省级政府
  • [C++] std::vector

    std vector template lt class T class Alloc 61 allocator lt T gt gt class vector generic template vector是表示可以改变大小的数组的序列容器
  • centos克隆

    下一步 下一步 选中创建完整克隆 启动克隆的系统 编辑 xff1a vi etc udev rules d 70 persistent net rules 修改之后 修改端口号和attr 修改完 执行 重启 xff1a reboot pin
  • 用pyhon下载jupyter遇到的问题(pip版本过低)

    首先安装jupyter 的前提是需要提前安装python 3 3版本及以上 然后输入 pip install jupyter 出现下面问题 python V 在命令行窗口输入 xff0c 验证python的版本 pip install ju
  • ubuntu利用usb_cam打开摄像头

    一 安装摄像头驱动usb cam 想要标定多个相机 xff0c 首先得把相机打开吧 xff0c usb cam是针对usb摄像头的ros驱动包 xff0c 简单来说就是得有这个功能包 xff0c 才能在ros中把摄像头打开 首先打开终端 x
  • Jmeter性能测试(1)---基础介绍

    jmeter xff08 一 xff09 基础介绍 参考书籍 xff1a 段念 软件性能测试与案例剖析 第二版 推荐一本书 零成本实现web性能测试 基于Apache jmeter xff0c 主要内容是一些关于jmeter的实战使用 xf
  • 利用Opencv实现物体的跟踪(1)

    目前感觉 xff0c 利用opencv实现的物体追踪 xff0c 关键要设置好你所检测对象的area xff0c 不然很容易出现混乱 本人也是自学 xff0c 敬请批评指正 import cv2 定义运算的核算子 BLUR RADIUS 6
  • C语言连连看秒杀辅助

    图像处理第一课 连连看秒杀辅助 项目效果 直接使用C语言 xff0c 实现 连连看 最强辅助 项目分析 项目的技术核心 不是逆向 xff0c 而是图像处理 图像处理 xff0c 更高维度的技术手段 电影中的图像处理应用 无人机战争 电影 完
  • 推荐10款适合C/C++开发人员的IDE

    IDE是程序员用于编程的应用程序或软件 IDE主要包括三部分 xff0c 即源代码编辑器 xff0c 构建自动化工具 xff08 编译器 xff09 和调试器 源代码编辑器是程序员可以编写代码的地方 xff0c 而程序员使用构建自动化工具来
  • C++五子棋人机对战

    目录 本教程配套视频 1 项目目标 2 效果演示 3 创建项目 4 项目框架设计 4 1 设计项目框架 4 2 根据设计框架创建类 5 给类添加主要接口 5 1 设计棋盘类Chess的主要接口 5 2 设计AI类的主要接口 5 3 设计Ma
  • VSCode这13款插件也太好用了

    又见VsCode Visual Studio Code xff08 简称VS Code xff09 是一个由微软开发 xff0c 同时支持Windows Linux 和 macOS 等操作系统的免费代码编辑器 xff0c 在2019年的St
  • C语言和C++的区别和联系,大多数人都说错了

    前言 C语言和C 43 43 到底是什么关系 xff1f 首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是对C语言的扩充和延伸 xff0c 并且对C语言提供后向兼容的能力 对于有些人说的C 43
  • C++之父做决定了:内部自救!

    进入2023年 xff0c 技术圈都在围观大洋彼岸的聊天机器ChatGPT xff0c 但对于编程圈而言 xff0c 没有什么比内存安全更能引起热议 近期美国国家安全局 xff08 NSA xff09 点名批评C 43 43 xff0c 建