首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.2  C/C++

1972年,贝尔实验室的Dennis Ritchie开发了C语言。从此,C语言就成为专业程序员所使用的主流语言,也成为了UNIX操作系统的主流语言。1980年,贝尔实验室的Bjarne Stroustrup开始在C语言中融入面向对象的特性,如封装和继承,最初称为C with Classes1983年,该语言被改称为C++。由于具有与C语言类似的语法和面向对象的优点,C++迅速流行起来。

由于CC++的强大功能和优点,它们迅速作为大学的推荐教学语言而流行起来。在C#Java等新语言开始流行的时候,CC++的程序和程序员需要数十年的时间来转移到那些新语言中去。

1.2.1  语言特性

作为编译型语言,高层CC++代码对于计算机处理器来说是很难理解的。编译器要将高层代码转换成处理器能理解和执行的机器语言。和Java等解释型语言不同,它们没有字节代码或中间层语言。而是将代码直接编译成计算机CPU能理解的指令,这种汇编过程缺乏平台独立性,代码必须为要运行该代码的系统而进行特定编译。

1. C

C由于它的强大功能和简单性而出名。当C还只有少数关键字和保留命令的时候,就已经提供了功能强大的函数。这些关键字决不会限制程序员的操作。相反,C程序员可以使用功能强大的运算符和多种数据类型来实现他们的目标。C的简单性受益于基础的C程序设计的易学性。

C的强大功能源于非限制性特性,程序员可以使用运算符在位层次上访问和修改数据。指针的使用或内存地址的直接引用在C中非常普遍(现代语言如Java等取消了该功能)C是面向过程的语言,它是以函数的形式来组织的,在这些函数中往往包含了完成特定任务的一个构造。模块性使得其代码可重用。函数群可以组织成库的形式导入到其他程序中,从而大大节省了开发时间。

C也是一种非常高效的语言。某些算法的实现可能和平台相关,并需要利用芯片的系统结构。C代码可以直接编译成机器可以识别的语言,因此在速度上比解释型语言如Java等具有优势。这种速度上的优势对于实时性要求高的应用系统而言是必需的,但是这种编译方法的缺点是C代码不具有平台独立性。当程序部署到新的平台时,有些代码可能要重写。因为应用C程序要涉及额外的工作,所以可能不会在新的操作系统和芯片集上发布。

这些性能使C很吸引程序员。C程序的确简单、美观,并且具有很强的功能。C程序特别适用于与UNIX操作系统进行交互和快速高效地执行大型计算或复杂的任务。

2. C++

C++C语言的扩展。它在添加面向对象编程的优点的同时,使用了与C语言类似的语法和运算符集。C++的优点描述如下。

   封装性:使用类将代码真正组成起来,形成代码模块化。关于执行数据操作的数据结构、数据和方法都被封装在类中。

   继承性:面向对象的组织和封装,使程序员更易于重用或“继承”以前的代码。由于继承使程序员不需要重写以前实现的函数,因而节省了时间。

   数据隐藏:对象,或者说是类的实例,可以包含有类外部的方法所不能改变的数据。程序员可以使用C++中的private来指定变量,以实现数据隐藏。

   抽象数据类型:程序员可以定义类(通常被视为C语言中的struct命令的扩展)类中可以包含程序员自定义的数据类型,同样也可以包含关于这种类型对象的操作。

Java不一样,C++并不是完全面向对象的语言。可以不利用面向对象的特性,而完全使用类似于开发C程序的方式来开发C++程序。

3. 安全性

CC++是在Internet之前发展起来的,因此其安全性是后来才补充的。安全领域的许多人都是从Elias Levy(其笔名为Aleph One)的论文Smashing the Stack for Fun and Profit开始学习缓冲区溢出技术。使用该技术,攻击者通过应用程序读取固定长度的值和随后发送的更长的值,来确定应用程序中是否存在栈或堆溢出,以及是否访问了受保护的内存等。

CC++不支持自动范围检测,因此其缺乏缓冲区溢出攻击的灵敏性。这就要求程序员对每个从外部源读入到程序中的变量都进行范围检测。JavaC#等语言添加了范围自动检测功能,从而消除了缓冲区溢出的威胁。

攻击者也有可能使用CC++程序来访问内存中的敏感区域。首先,在这两种语言中指针的使用非常广泛。指针可以直接通过内存地址来访问内存。JavaC#使用引用变量,必须使用它们的名称(取代地址)才能访问内存。Java还提供了sandbox安全模型,sandbox中的程序在读取和修改外部数据方面受到了严格限制。而CC++没有sandbox模型的概念。

1.2.2  Hello,World!实例

Hello World!”程序通常被作为最简单的入门程序来介绍。初级程序员通常通过开发“Hello World!”来理解语言的基础结构,学习编译和运行程序的过程。下面是C语言的“Hello World!”实例。

1-1  HelloWorld!

1 #include <stdio.h>

2 int main( void ){

           3         printf("%s", "Hello, World!");

4       return 0;

5 }

在本例中,首先引入了标准的输入/输出库,它包含了交互式程序经常使用的函数,如printf。该程序只由一个函数构成,该函数不携带参数(用关键字void来说明),并返回一个整数。第3行的printf语句在命令行的标准输出接口中输出一个字符串。%s表示输出一个字符串类型的变量,本例中输出的字符串是“Hello World!”。下面将详细介绍有关类型和函数的概念。

1.2.3  数据类型

程序设计语言中的数据类型用于在变量初始化之前对其进行定义。数据类型指定变量在内存中的存储方式和变量的保存类型。有趣的是,虽然数据类型通常用于指定变量的大小,但是为每种类型分配的内存空间也是不一样的。因此,程序员在编码之前必须了解它们的开发平台。变量可以说是数据类型的一个实例。CC++语言使用的标准数据类型如下所示。

   int:代表整数。大多数系统为每个int类型数据分配4个字节的内存空间。

   float:代表浮点数。大多数系统为每个float类型数据分配4个字节的内存空间。

   double:代表双浮点数。大多数系统为每个double类型数据分配8个字节的内存空间。

   char:代表字符。大多数系统为每个char类型数据分配1个字节的内存空间。

另外,还有用于变更前述数据类型的大小和类型的调节器,它们是shortlongsignedunsignedsigned类型可以包含整数或负数,unsigned只能包含整数。在默认情况下,数字的类型是signed类型。图1-1显示了C/C++的数据类型及其分类。

1-1  C/C++的数据类型及其分类

CC++中,程序员可以使用typedef来定义自己的数据类型。typedef的使用使程序更具可读性。举个例子,下述两个示例虽然在功能上是等效的,但是利用typedef的示例更容易让人理解。

1-2  typedef

1 int weight( void ){

2                 int johnweight;

3                 johnweight = 150;

4                 return johnweight;

5 }

6 int weight( void ){

7                 typedef int weight; /* in pounds */

8                 weight johnweight = 150;

9                 return johnweight;

10 }

这个示例指出,typedef命令不仅使代码更具可读性,而且也可以用于添加数据类型的特性。第7行的注释表明,所有weight类型的变量都以英镑为单位。从第8行可以看出,变量johnweight具有weight类型数据的特性。在没有typedef的示例中,johnweight变量是简单的整型数据。随着程序变得越来越大,typedef的优点将逐渐体现出来。在前述示例中两种方法都很清晰,但是在几百行代码之后,定义一个weight类型的变量可能会给变量的使用提供重要的信息。

C语言还提供了下述内部结构。

   数组(array):同类型数据的索引群。

   指针(pointer):引用其他变量的变量。

   结构(struct):包含多类型数据的记录。

   共用体(union):只包含一个值,但是却含有多种数据类型,可以通过字段选择器来访问。

   枚举(enum):已定义的值的集合变量。

关键字struct通常用于创建包含多个变量的高级数据类型。通常,结构都是用typedef自定义的。例1-3显示了struct的数据结构。

1-3  struct

1 struct person{

2         String name;       /* A native String type */

3        Height h;          /* Must define "Height" elsewhere */

4        Weight w;       /* Must define "Weight" elsewhere */

5 } record;

程序员可以使用该结构从逻辑上封装个人的信息,从而能很方便地访问个人信息。因此,求John的体重和Tom的体重的和的代码可以为:

int combinedweight = John.w + Tom.w

 

 故障和排除

创建攻击树

客观评估新的计算机系统所受的威胁是很重要的。攻击树是一个协助开发者理解系统风险的模型。可以从攻击者的角度构建一棵攻击树。根节点是攻击的目标,子节点是完成目标所使用的技术,这些节点的子节点则是完成该目标的子方法或技术。

攻击树的创建完成后,要为每个节点分配概率。可以从下到上、从叶节点到根节点依次为每个节点分配系统全局安全的概率值。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论