首页 >>  正文

c和c#和c++区别

来源:baiyundou.net   日期:2024-08-22

作者 | 苏宓

出品 | CSDN(ID:CSDNnews)

如果说此前 Kotlin、Dart、Julia、Carbon 等后起之秀向老牌编程语言发起挑战进攻都是小打小闹,那么这一次 C、C++ 这几种常青藤编程语言则是真实地陷入了尴尬的境地。

近日,美国国家安全局(NSA)发布了最新的指南,鼓励多个组织将编程语言从 C/C++ 转为使用内存安全的语言,如 C#、Rust、Go、Java、Ruby 和 Swift,主要原因是这样可以帮助软件开发者和使用者预防并缓解软件内存安全问题,这些问题占可利用漏洞的很大一部分。

安全的第一大“杀手”——内存漏洞

一直以来,内存安全的漏洞引起多个企业与开发者的警觉。

根据长期关注内存漏洞的开发者 @LazyFishBarrel 的统计,苹果公司的 iOS 和 macOS 系统中 60%-70% 的漏洞是内存安全漏洞。

微软在 2019 年的一次会议上透露,从 2006 年到 2018 年,其发现的 70% 的漏洞都是因内存安全问题造成的。

据 Google 估计,Chrome 中存在了类似比例的内存安全漏洞,另外 90% 的 Android 系统漏洞也都是内存安全问题。

为此,NSA 认为,黑客极有可能会利用代码中管理不善的内存漏洞,而这种漏洞在程序员使用灵活性更高的编程语言时更容易出现。于是,其最新发布了《软件内存安全之网络安全信息指南》时,写道,「黑客可以利用这些漏洞进行远程代码执行或其他不利影响,这通常会危及设备,并且成为大规模网络入侵的第一步」,因此 NSA 建议各个组织尽可能使用内存安全语言,并通过代码强化防御(如编译器选项、工具选项和操作系统配置)来增强保护。

NSA 网络安全技术总监 Neal Ziring 表示,在开发消除此类漏洞的软件时,必须始终使用内存安全语言和其他保护措施。

C、C++ 成为重灾区

在 NSA 看来,我们常用的编程语言如 C 和 C++,在内存管理方面提供了很大的自由度和灵活性,但用这种语言开发的应用程序的安全性很大程度上需要依赖程序员的测试、检测环节。

不过,只要程序员自身稍微有些疏忽,简单的 Bug 也会带来严重的内存漏洞。

虽然当前行业中有很多软件分析工具能够检测到许多内存管理问题,操作环境选项也可以提供一些保护,但内存安全软件语言所提供的固有保护可以防止或减轻大多数内存管理问题。

针对这一问题,几年前,微软云开发推广部的 Ryan Levick 在分享微软为什么要从 C/C++ 转向 Rust 时,也曾直言,「无论软件公司在工具和人员的培训上投入多少精力也不能解决问题,因为 C++ 本质上就不是安全的语言」。他表示:“我们使用的语言由于年代久远、来自不同时代,无法为我们提供保护,让我们免受此类漏洞攻击。C++ 不是一种内存安全的语言,相信这一点无人有异议。”

近日来,微软 Azure CTO Mark Russinovich 也再次呼吁,「是时候停止使用 C/C++ 启动任何新项目」。

然而,众所周知,C 和 C++ 是编写核心系统软件的默认语言。这两门编程语言速度快,而且源代码可以直接汇编成机器语言。

虽然一边有很多企业高管呼吁不要用,但另一边也有很多人不信邪,不愿相信 C、C++ 语言的不足之处。

为此,有人称,“只要你不使用从 C 继承的任何功能,C++ 就是安全的”,亦或者“只要遵从现代 C++ 的类型和管用做法,就不会引发内存方面的漏洞”。针对这一争论,科技圈中有开发者现身说法,根据自身在大型 C++ 项目上(遵从现代的惯用做法)的开发经验,发表了《》一文,用实例证明 C++ 提供的类型完全不能阻止漏洞的泛滥。

另外,也有人提出质疑,“为什么非要弃用 C、C++ 呢,有什么理由不能在 C、C++ 编译器中强制执行内存安全吗?”

针对这一点,有开发者进行回应:

这在以前就已经尝试过了。

但挑战是双重的。首先,如果在编译器强制执行内存安全,范围也只能局限在编译器上。然而,真正的内存安全实际上是(至少)线程安全、空值安全和类型安全,以及大多数人所想的原始边界检查等各个方面。除非你打算进入托管语言领域(Managed Language)并引入 GC,否则你需要语言级别的结构来允许程序员在这些新的边界内有效工作。例如,在 Rust 中,这就是 "所有权 "系统。

第二点是,如果总是把语言功能限制在一些有限的、更安全的范围内,或者用一些自定义的东西取代核心功能(例如 malloc 或编译器)。这就把你能使用的库限制在那些使用功能集的库上,并要求你无限期地维护这些核心功能。即便如此,你也不会得到 "真正的 "安全,因为这取决于每个人都很小心、不使用错误的功能、编译器,而你又非常确定你的核心实现本身是安全的。

因此,如果你全力以赴,与其需要一个特定的编译器,再加上一套不同的核心语言特性,再加上你需要确保所有的支持库都符合要求,再加上需要为静态分析和编译工具链定制支持工具,倒不如直接用一种新的语言,Rust 便是不错的选择。

Rust 是未来,但任重而道远

「弃用 C、C++,扶持 Rust」的争论经过几年的发酵持续到现在,愈演愈烈。与此同时,推动软件开发向使用内存安全语言发展的队伍也从最初微软、Google、亚马逊等大厂的倡议,逐渐拓展到具体的开发者们以及学术界,现如今也包括了 NSA 在列。

NSA 表示,使用内存安全语言可以帮助防止程序员引入某些类型的内存相关问题。

内存是作为计算机语言的一部分自动管理的,它不依赖于程序员添加代码来实现内存保护。内存管理通常是使用编译和运行时检查机制来实时自动保护。使用更加安全的语言,如 C#、Go、Java、Ruby、Rust、和 Swift 等语言,可以一定程度上保护程序员不会无意中引入内存管理错误。

不过,罗马并非一日之功。

要想用 Rust 将 C、C++ 取而代之,也需要很长的一段时间,为此 C++ 之父 Bjarne Stroustrup 在回应 C++ 与 Rust 之争时分享道,“直接替换 C++ 代码,或者让它们变得更加安全都是一项非常艰巨的任务,需要逐步慢慢地才能做到这一点。否则大量不安全的 C++ 代码将会永远存在。”

网络安全公司 Acronis 的 CISO Kevin Reed 在接受外媒 The Register 采访时也说道,“多年来,使用 C 和 C++ 编写的代码数量巨大,即使我们明天都开始使用 Rust 和 Go,也需要几十年的时间才能清理这个烂摊子。”

参考资料:

https://langui.sh/2021/12/13/apple-memory-safety/

https://www.theregister.com/2022/11/11/nsa_urges_orgs_to_use/

https://www.nsa.gov/Press-Room/News-Highlights/Article/Article/3215760/nsa-releases-guidance-on-how-to-protect-against-software-memory-safety-issues/

https://media.defense.gov/2022/Nov/10/2003112742/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY.PDF

☞☞

","force_purephv":"0","gnid":"9a7e239220820714e","img_data":[{"flag":2,"img":[{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t0186957a1ca5352752_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t0186957a1ca5352752.gif","width":"640"},{"desc":"","height":"171","title":"","url":"https://p0.ssl.img.360kuai.com/t01e374652223f11eb5.jpg","width":"521"},{"desc":"","height":"305","title":"","url":"https://p0.ssl.img.360kuai.com/t016ac74b85300ac49e.jpg","width":"640"},{"desc":"","height":"379","title":"","url":"https://p0.ssl.img.360kuai.com/t01efc0973dbc525ad5.jpg","width":"1080"}]}],"original":0,"pat":"art_src_1,fts0,sts0,op50_st","powerby":"cache","pub_time":1668474553000,"pure":"","rawurl":"http://zm.news.so.com/0296c5ba181f177d2e7c9dfbfbee16fe","redirect":0,"rptid":"0e752c1c6c6793fa","s":"t","src":"CSDN","tag":[{"clk":"ktechnology_1:微软","k":"微软","u":""},{"clk":"ktechnology_1:nsa","k":"nsa","u":""},{"clk":"ktechnology_1:内存","k":"内存","u":""},{"clk":"ktechnology_1:美国","k":"美国","u":""}],"title":"美国国家安全局督促弃用 C/C++,使用更安全的 Rust、C# 等!

娄邰庄4043C++和C#的区别是什么?
屠依兰15859618767 ______ C++是C的改进版本,跟C的语法差别不大,很多集成环境多是兼容的.而C#就不同了,他虽然也保留着C的一些用法,但是编程语法上已有相对较大的不同,它更像JAVA.

娄邰庄4043C++与C#的区别是什么? -
屠依兰15859618767 ______ copy的,你看看语法结构上,C++和C#基本上相同,只有以下方面有所区别:1、继承:C++支持多继承,C#类只能继承一个基类中的实现但可以实现多个接口.2、数组:声明 C# 数组和声明 C++ 数组的语...

娄邰庄4043c++与C#有什么区别?各自侧重点是什么? -
屠依兰15859618767 ______ 抄来的:C#是用来做应用程序和软件的,优点就是快速开发,有功能强大的.NET FRAMEWORK的支持. 而C/C++是用来做系统程序的,(也能做应用软件,但没有C#方便),优点很多,比其它的高级语言更容易对内存,以及作系统底层相关的...

娄邰庄4043c++和c#有什么区别和联系吗? -
屠依兰15859618767 ______ 怎么说能,其实没联系.C语言你知道吧?C++ C# Java都是C系语言,也就是过程层面的语法跟C几乎一样,使用相同的关键字,例如,for while if else 还有逻辑符号(比如 ==, !=)还有null关键字.打个比方,c是爸爸,c++,C# java都是c的儿子,所以都比较像C.其中C++是大儿子,出现时间最长,java90年代出来的,C#是00年以后出来的,另外Java的干爹是oracle,C#的干爹是微软.C#和java喜欢拼爹,因为他们的爹都很有钱,所以java有什么,C#就有什么.但是缺点是,java出身比较贫寒,可以在linux这种便宜货上部署,C#就不行了,只能在干爹的高档操作系统windows上跑.

娄邰庄4043C++和C#有什么明显的区别?
屠依兰15859618767 ______ 一个面向过程,一个面向对象,这个是最根本的区别

娄邰庄4043c++和C#有什么区别 -
屠依兰15859618767 ______ 最明显的一点就是 C++有指针,而C#没有

娄邰庄4043C#和C语言 C++有联系吗 有什么区别 -
屠依兰15859618767 ______ c C++都是语言 ,C++扩展了c C#是工具 封装很多类 C 到 C++ 到 C# 从表面理解 C 升级 C++ ----------- C++ 升级 ---------- C++ ++ 不就是 C#了吗 C#是一种面向对象的、运行于.NET Framework之上的高级程序设计语言 至于学C#有前途吗 只要微软不倒闭 你就有饭吃 C语言 和这两者比属于低级语言

娄邰庄4043C++和C#有区别吗 -
屠依兰15859618767 ______ 1、表面上看,特别是语法上看:C#是C++的升级版,C++的语法C#基本上都支持,但也有很多不同,所以多数代码不能直接移植,特别是内置函数与功能调用有很多不同.但在核心上,应用针对性上看,两者可能完全不同,特别是C++不使用....

娄邰庄4043C++和C#有什么区别
屠依兰15859618767 ______ 当然不是 依据是 C#是基于.Net Framework 开发的一套编程开发环境 它的优点是 安全、高效 缺点是性能略差(照顾安全了 不过现在好多了)、必须在.Net Runtime下运行 C++ 是很早出来的语言 它和C#有着本质的区别 那就是C++编译出来的程序是 本地代码 和.Net无任何关系 两者的语言看似区别不大 但稍微深究 就会发现区别相当的大 例如 C#没有指针 数组的声明和C++有所不同 C++允许多重继承 而C#不能... 等等等等 综上 这两个是有着本质区别的语言 (还有一个区别 就是C++是自由群体设计出来的 不属于任何公司 而C#是微软设计出来的 目的是为了挤垮Java^_^)

娄邰庄4043C语言C++和C#的区别和共同 -
屠依兰15859618767 ______ 共同点:C,C++,C#的主要控制流程基本一致(如if, for, while)基本的语法结构一致,风格一致不同点:C是面向过程的语言C++,C#是面向对象的语言C++与C关系更近(C++完全兼容C)...

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024