② 最常见的几种入侵盘算机的伎俩都是使用了C语言的某些特点。当你在C语言中为输入的内容分配出一片内存(也叫“缓存”)时,它会被分配在当前运行代码的返回地点旁边。所谓“返回地点”指的是一块特定内存,当前代码运行完毕以后,就要运行这块内存中包罗的代码。也就是说,它现实上是盘算机下一步要做的事变。
假定有人计划入侵你的盘算机,他们猜出你会为某种输入分配256字节的缓存,于是他们就提交多于256字节的内容,目标是覆盖旁边的“返回地点”。那么,当前代码运行完毕之后,步伐的控制权就交给了他们指定的内存地点。这个地点通常是缓存的首地点,缓存中是入侵者事前编好的呆板码。于是,入侵者的步伐就运行在你的盘算机上了。
假如利用更抽象的高级语言,上面的事变是不大概发生的。但是,在C语言中,一旦担当用户输入的时间你没有查抄输入长度,就创造出了一个安全毛病。使用这种毛病的攻击举动就被称为“缓冲区溢出攻击”。在这种攻击中,另有其他方法可以控制盘算机,但是覆盖返回地点是最经典的一种。
故意思的是,挟制飞机与“缓冲区溢出攻击”有雷同之处。在一样平常飞机上,搭客区与驾驶舱是相通的,就似乎C语言中数据区与代码区是相邻的一样。劫机者一旦进入驾驶舱,现实上就相称于把本身从数据提拔为代码。
安全带照旧手铐?
语言计划者之间的最大分歧大概就在于,有些人以为编程语言应该防止步伐员干蠢事,另一些人则以为步伐员应该可以用编程语言干统统他们想干的事。Java语言是前一个阵营的代表,Perl语言则是后一个阵营的代表。(美国国防部很看中Java也就不敷为奇了。)
自由语言派的信徒讽刺另一方是“B&D”(奴役和戒律,Bondage and Discipline)语言,很无礼地暗示用那些语言编程的人是劣等人。我不知道对方怎样反击这些喜好Perl的自由派,大概他们不喜好给别人起外号,因此我就无从知道。
由于防止步伐员做蠢事有好几种方法,以是上面的争论渐渐分化成几个较小的议题。现在最活泼的议题之一就是静态范例语言与动态范例语言之争。在静态范例语言中,写代码时必须知道每个变量的范例。而在动态范例语言中,任意什么时间,你都可以把变量设为恣意范例的值。
静态范例语言的附和者以为如许可以防止bug,而且资助编译器天生更快的代码(这两点来由都建立)。动态范例语言的附和者以为静态范例对步伐构成了限定(这点来由也建立)。我本人更喜好动态范例,悔恨那些限定我的自由的语言。但是,确实有一些很智慧的人看来喜好用静态范例语言。以是,这个题目依然值得讨论,并没有固定答案。
面向对象编程
⑤ 拜见Carlo Cipolla所著的《枪,帆船,帝国:技能革新在1400~1700年欧洲扩张早期阶段的作用》(Guns, Sails, and Empires: Technological Innovation and the Early Phases of European Expansion 1400-1700),Pantheon,1965年出书。