点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”. r$ R2 n2 {. { ?/ z9 T/ C
干货福利,第一时间送达!
& u9 H/ E, D# L& T8 w. S# i1 A! \: G* ?% w" M P5 L2 a% W$ B1 `
hx5we1hj55n6404006745.png
* m7 O8 k+ D( w; w* T
最近有小伙伴说没有收到当天的文章推送,这是因为微信改了推送机制,有一部分小伙伴刷不到当天的文章,一些比较实用的知识和信息,错过了就是错过了,建议大家加个星标??,就能第一时间收到推送。
2 e7 K' j- R" K' ~; Y# o+ u
qle1cyfjzgg6404006845.png
' P; L5 d) S0 ?1 c" g) g
) ~' z8 ^- s; N" \
( w" E' ~3 }, R* y$ w' W在不久前TIOBE发布的10月编程语言排行榜上,C++一举越过Java,摘得探花位,仅次于Python和C。年过四旬的C++依然是全球最流行的编程语言之一,不过近年来一些巨头的动向也让C++的安全性频频走向争议的中心。9 p `% I# i, Q! e; N' i
& y- M1 k7 ?+ z- ^1 Z- R/ x3 w0 J前有微软透露正基于Rust 语言改写 Windows 11 内核,部分替代之前的 C++,后有谷歌声称正在将 Android 原生代码从 C++ 迁移到 Rust,从而进一步减少安全漏洞。
; T- i6 G+ ~( h9 m' b * y' s% c& m9 p" q
就在外界纷纷揣测C++如何应对突如其来的中年危机,是否真的应该让位于后起之秀时,近日C++之父Bjarne Stroustrup在上个月举办的编程语言年度大会上公开表态:他将增加新的安全工具应对批评,为全球数十亿行C++代码带来新的解决方案。8 x" W2 F0 Q% @; u
! I6 y. e# @* k, O
3 ^2 o9 l, E/ o- q+ R o
0inic1ihbzu6404006946.png
" t: P6 O* c$ {4 X+ I9 [( o
$ D' G" O1 j9 T) ?- `
, s! E0 \1 E9 B; Z: g5 Y
vqednsvqai26404007046.png
7 K+ \" A, x9 Q, B
反驳:切换到新语言,没那么简单
! j% _: F. V" h+ c( s$ v6 b' B/ u* {( n4 t; P
对于那些认为问题出在C++本身、解决方案是改用另一种语言的批评人士,这位已经72岁的大佬予以了驳斥。1 _& k! ~& \ E5 k. d$ C2 r% S8 {
0 o. g! Z/ x2 S4 d+ I
第一,安全性指的不仅仅是内存安全。: \' C( j: f) n4 H' g) _3 p
第二,语言之间的互操作性需求往往会被忽视。
4 w; ~& j; \# l1 ~' n a& G9 A第三,语言切换的成本通常会被低估。+ E9 R: \. Q; R1 w) k
/ M8 c9 }' T3 N+ F7 V9 P+ DStroustrup首先指出“通常提到的安全性只是内存安全——这是不够的......与其他语言(包括C++和C)进行互操作的需求往往不会被提及。而且转换的成本可能非常高。这一点很少被提及......”! ]6 T0 n( z$ K
- T. b0 R" Z) ?, H“从我所看到的观点来看,我们将用大约7种不同的语言来取代C++。也许在距今四十年后,我们可能会有20种不同的语言,它们必须相互操作。这将会很困难。”% v3 H4 k: J: R0 F5 q- L
! i. @0 f0 J9 Y: D8 r6 @ j1 |Stroustrup还指出,“许多所谓的‘安全’语言将所有底层的东西都外包给了C或C++”,暂时脱离原始语言来访问硬件资源,甚至操作系统(通常是用C编写的)——甚至可能是极为古老的、藏在外部库中的“可信代码”……/ a& u$ q3 z. z' C
) G9 I+ x Z. X2 OStroustrup把我们目前的情况称为“一种渐进式和进化式的方法,而不是一味追求全新的方法。”就像盖尔定律:“一个有效的复杂系统势必是从一个有效的简单系统发展而来的。”' O9 c4 |. ?! i
$ |+ g# M5 s7 R3 l归根结底,就像Stroustrup所指出的,切换语言可能看起来是在构建一个新系统,但是想越过所有旧系统的问题来解决一切,只是一个幻想。切换语言所要付出的代价可能远比你理想中的要高。9 X* B) L' v6 h9 }
0 R0 F- |+ D5 j X! N
affecvwwquy6404007146.png
" n+ `; J# P5 s- o) \3 W
出新:“小心”是行不通的,“我们需要强制执行的规则”
6 n; @& n3 i1 F5 G4 j, q1 R4 ?- V8 ~8 D7 v2 a/ s& R& m3 z
Stroustrup提到了安全性的许多概念,重点介绍了资源泄漏、溢出、内存损坏、计时错误、并发错误、终止错误——当然还有类型错误。随后,他就C++安全性的发展趋向进行了详细阐释。7 f& p% X9 d$ e: L6 I" n
& @5 x5 w" ~( s! J& }
Stroustrup称当前是“一个机会”,他强调,类型和资源安全从C++诞生之初就一直是它的目标。“我们当时的硬件无法提供完全的安全性,现在也无法对所有语言和所有用例提供完全的安全性。”但是Stroustrup也不希望看到对C++表达的限制,事实上他设想了一个仍然遵循该语言的ISO标准的解决方案。
) k7 S5 T5 H2 k! w/ u( @* |
8 T; d, [: I1 A5 p“我们需要它是C++。也就是说,我们能做什么不应该受到限制,即使我们如何做可能会受到限制。”
/ n% @5 ?9 a+ ?3 h. m3 y4 V
4 Y8 C0 C( L" ]' g- V6 I, P与此同时,Stroustrup 也不希望看到大量的额外运行时开销。“性能不应该有任何下降......实际上,编写安全代码的一些技术可以提高性能。我主要谈论的是编译器和静态检查可以做什么,因为它是免费的,或者实际上可以提高性能。”
8 s3 W1 ]6 |* g! h
1 b& h# L) J/ O8 DStroustrup找到了他的解决方案:配置文件。也就是说,一套规则,只要遵守,就能实现特定的安全保证。它们将由ISO C++标准定义,解决常见的安全问题,如指针和数组范围。
U) N$ e% }: c5 k 4 O" I# _0 `7 O2 H4 w9 e
至于添加新工具的困难,Stroustrup指出,C++编译器本身现在是一个相当复杂的静态分析器,也可以满足配置文件的要求。因此,在添加提高安全性的工具时,“我认为配置文件注释应该有助于解决这个问题”。
% K) o+ J8 @: f3 k O ) |: g* S3 z0 _$ O' b( a5 u, T& y X" W
Stroustrup列出了一般策略:使用静态分析来消除潜在的错误。但Stroustrup补充说:“全局静态分析是负担不起的。”
5 H: A2 }$ ?) Z : l( s2 y/ v4 b% D `' B$ B) i
“所以基本上我们需要规则来简化我们正在编写的内容,使其能够高效、低成本地分析——本地静态分析……然后提供库,使依赖这些规则变得可行。”
3 M& c) ]5 H8 e( D ~! I+ {* ? 9 ]0 o/ D# a, r
另外,他还指出了这种策略的另一个优势:“支持从旧代码到提供担保的现代代码的逐步转换。”将有一套标准的“基本”担保,以及更大、更开放的可用担保。Stroustrup说:“我想象的是类型和资源安全,内存安全,范围安全。诸如算术安全之类的东西是可以标准化的。”此外,还将制定规则,对不同的代码片段应用不同的保证。代码甚至可以得到应用了哪些保证的显式表达式(从而使将来的读者放心)。
& ], p: A' \& P # C8 w5 {) F- k: @. W
Stroustrup简要说明了一点:“小心”是行不通的。因此,虽然核心指导方针可能建议安全的编码实践,但“我们需要强制执行的规则”。
4 _2 ^5 a- B- | 8 B4 p d7 b0 A, Y
“我们必须制定安全使用的规则。我们必须提供方法来验证人们是否真的在做他们想做的事情。”Stroustrup指出,他所描述的大部分内容已经被尝试过,甚至有规模化的实践。“但这些都没有被整合成一个一致的、连贯的整体。这就是我认为我们应该做的。”" s% f+ R, D, f( l- |
4 W) d. g( y0 v$ V1 B3 e! p7 v2 T
“卫生规则+静态分析+运行时检查”就是被提炼出的公式。Stroustrup说C++可以消除许多常见的错误,包括未初始化的变量,范围错误,空指针解引用,资源泄漏和悬空引用。
2 s. D- U3 L) T# y3 R7 a ; ]8 R) o2 }7 k( B
在演讲接近尾声时,Stroustrup谈到了更多的细节。“我建议你采用基于模块的控件。”1 J2 X# g+ t: T8 v7 ~7 ~- ^. U
$ w# c/ ^5 G6 k8 H0 R/ K
export My_module[[provide(memory_safety)]];
) E) F; [+ T7 D) j9 g8 @3 Bimport std [[enable(memory_safety)]];
1 r8 o3 T/ N: Q' v7 d) Eimport Mod [suppress(type_safety)]];
2 \. e0 S s1 S2 o' W( ?9 \6 B2 A: q6 E% `
还在开发中的是代码内控件,用于代码片段。8 P: w3 i9 f8 M7 e7 _+ b. R* v
$ r6 @& x" s1 o# w" k, p; V0 ~
[[suppress(type_safety)]] X
5 Z; n. ~; o/ ?( ?[[enforce(type_safety)]] X& s+ w; B* k2 m+ I( m$ s; K
" b! R" o. O* ~8 D# A
) f2 E _. {% [$ L0 ]* M* [
b4zw5jcxdlf6404007246.png
5 y2 F3 q3 ?4 Z# v) n9 M合力:面向开发者的愿望清单
( f9 @$ }* h; `# U. \% ` [5 F , k! x) E1 i E; I
目前这项工作还在进行中,你可以查到与之相关的论文和讨论。Stroustrup谈到:“从经典的C,从‘带类的C’,到C++11,我们已经走了很长很长的路。”
1 h* b0 g6 T2 |9 B- K6 Z
+ ~" I. A3 X% ~- M7 Q! c面向开发者,Stroustrup建议用户可以帮助完善配置文件并将其规范形式化。“我梦想着像 Profiles Light 这样的东西,它提供了配置文件的大部分保证,但不能做所有最后的事情,因为,比如说,静态分析器还不能做到这一点。”
" m: I+ B. r0 X& |9 Y! k : {3 e. k2 L$ A5 N& L
Stroustrup创建了一个 GitHub 存储库,“人们可以在那里提出建议,我将把我的草稿等放在那里,这样我们就可以创建一个社区,致力于在合理的时间内完成这些事情。
6 w* e, E: K, o" J6 B + f$ k2 o5 Y* K/ r* c+ ^3 X! |
存储库询问需要什么才能使配置文件成为“满足各种 C++ 安全需求的全行业工具”,并将该概念称为框架。“为了实现广泛使用,必须创建和安装许多部件。虽然我们已经做了很多工作,但广泛可用的相对较少。这是一个愿望清单。请尽你所能提供帮助。”+ N5 n: B" Z7 S3 Q2 ]: W h o4 p& B
; g- c$ i3 \( H; D5 n5 F: K$ V) u+ }) H/ v f4 p( t w
b5232wt1iq46404007346.png
+ o; p: N1 u) }
0 x7 J8 H. [1 X. L* H* Y; w& `
参考链接:
1 a, Y* |* n) Q( r/ ihttps://thenewstack.io/bjarne-stroustrups-plan-for-bringing-safety-to-c/
0 @! w- \( P8 ?3 ehttps://www.youtube.com/watch?v=I8UvQKvOSSw&t=4371s
5 V) ^; J ~3 n/ f转自:51cto
; h$ f A9 k& d7 @4 W, O——EOF——一个我十分佩服的朋友阿秀开发了一个互联网大厂面试真题记录网站,支持按照行业、公司、岗位、科目、考察时间等查看面试真题,有意者欢迎扫码下方二维码适用~
5 q! ?: X. ^1 B. c2 V. K, b t
2xtbqvefudz6404007446.png
0 f% g2 |* U3 e1 s
0 _- v4 E2 Q: q你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节跳动电商等部门担任Linux C/C++后端研发工程师。, e1 j& ^0 p7 F7 j7 r4 c
同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。! c y4 h8 E9 M6 ]
我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。: @+ f, E6 S5 C/ \# n" \4 d2 a% W) F
00r1a0xpsni6404007546.png
' t( V. {# X! ~
欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会。" d$ ]( g/ G% e) Q& Z# {7 B, `
, M) P( o/ E+ F5 q" }" ~
k22fbfmkh3m6404007646.png
4 S7 N- X( E" x+ S8 n加个微信,打开另一扇窗
7 A' M9 @2 r; w/ ~0 {+ b
sa5n0iluwqx6404007746.gif
|