APP下载

安全防护技术在故障安全平台研发中的应用和思考

2013-05-08卢利勇孙寿龙

铁路通信信号工程技术 2013年1期
关键词:编译器C语言编程

卢利勇 孙寿龙

(北京全路通信信号研究设计院有限公司,北京 100073)

卢利勇,男,硕士毕业于兰州交通大学,工程师。主要研究方向包括嵌入式系统设计、计算机联锁系统开发,曾参与DS6-60故障安全平台、全电子计算机联锁项目。

随着轨道交通系统的日新月异发展,轨道交通系统相关设备的需求也日益扩大。故障安全平台,不仅可以应用到国有铁路的车站联锁控制,还可以应用到城市轨道交通信号控制系统中,如计算机联锁系统、区域控制中心等,还可以作为CTCS-2或CTCS-3系统中的车站列控中心使用,具有广阔的应用前景。

然而轨道交通系统作为大容量公共交通工具,其安全性直接关系到广大乘客的生命安全。其中信号系统作为保证列车安全、正点、快捷、舒适、高密度不间断运行的重要技术装备,在轨道交通系统中有着举足轻重的地位。因此,对信号系统其中的故障安全平台的安全性提出更高的要求。

在研发中使用哪些安全防护技术更好、更有效,从而使故障安全平台更加安全可靠,成为困扰众多研发者的问题。

本文以DS6-60①DS6-60型故障安全平台是北京全路通信信号研究设计院有限公司自主创新研发的一个符合欧洲铁路安全标准的计算机联锁系统。该系统采用二乘二取二冗余结构设计, 系统中所有涉及到安全信息处理和传输的部件均按照“故障-安全”原则采取了2重系结构设计,满足铁路车站信号控制设备高可靠和高安全的使用要求。现已在全路大面积推广。故障安全平台为例,对二取二安全机制、工具安全性分析和防御性编程3种关键安全防护技术的使用进行阐述。

1 防护技术一:二取二安全机制

二取二防护机制能有效防止单点故障,二取二安全机制在实现上还需要注意些什么,下面结合一个例子来说明。

如图1所示,图1中执行模块的设计,为了防止一个CPU发生故障,误输出,使用了双CPU二取二协同输出的方式,CPU1输出动态脉冲码,CPU2输出静态电平信号,只有当CPU1和CPU2都输出时,执行模块通过表决器最终才会输出驱动信号。

下面设想几种场景,分析基于以上设计,是否还有危险输出。

1)场景1:CPU1故障一直输出动态脉冲②CPU1为动态输出,如果CPU1输出动态脉冲表示系统本周期有输出,如果CPU1输出静态电平表示系统本周期无输出。。这时二取二已经失效,相当于只有CPU2控制输出。

解决方法:如图1中线2,CPU1回读CPU2的输出信号,CPU1每周期在输出前,先要检查CPU2的输出状态,只有CPU2有输出,CPU1才输出动态脉冲,否则CPU1不输出。

2)场景2③每一种场景都是基于上一场景提出问题已解决,结构已完善的基础上。:比较器故障。CPU1和CPU2都没有输出,通过比较器输出了驱动信号,驱动继电器误动作。

解决方法:如图1中线1。CPU2每周期都会通过检测回读电路获得比较器后端的输出,如果本周期CPU2没有输出,而比较器后端有输出,CPU2经过过滤期④过滤期为系统可容忍的最大时间,由具体的系统功能确定该时间。后,做出相应的故障安全处理。

3)场景3:CPU2检测回读电路故障。比较器故障后,产生了误输出,由于检测电路故障,不能及时发现。

解决方法:系统在没有输出的周期,产生时间较短、能量较弱的确保不会导致现场设备动作的测试输出信号,这样,在没有输出时,通过测试输出信号,及时发现检测回读电路的状态,一旦发现检测回读电路故障,立即做安全处理,确保不会误输出。

双CPU同步是二取二实现的一个关键问题,如图2所示,DS6-60逻辑部二取二硬件设计中,采用同一个时钟源产生时钟,然后经过同步中断产生电路,产生固定周期的中断信号,为双CPU任务级同步提供硬件支持。为了防止时钟源跑偏,每个CPU除了外部同步中断计时,内部也有定时器计时,每周期开始要对外部同步中断计时和内部定时器计时进行校准,确保内部和外部计时的一致性。

两个CPU采用相同的输入数据进行独立运算,运算结果通过双口RAM进行交互,比较一致时才可以对外输出;如果不一致,系统退出控制,导向安全侧,保证系统的高安全性。比较原理如图3所示。

2 安全防护技术二:工具安全性分析

在软件开发的不同阶段中,工具对开发者都是有很多帮助的。

在开发DS6-60系统过程中,使用SVN做文档和代码管理,使用了Testbed 做静态走查和单元测试,使用了ADS集成开发环境,在ARM芯片上完成调试和下载等。

根据EN50128对工具的分类,T1类工具为不产生任何对软件执行代码(包括数据)影响的工具;T2类工具为支持对设计或执行代码进行测试或验证功能,该类工具中的缺陷可能导致不能有效地发现设计或执行代码的缺陷,但是该类工具不会直接在执行软件中产生错误;T3类工具为产生对安全相关系统的执行代码(包括数据)直接或间接有影响的输出工具。

以上罗列的几种工具,其中SVN为T1类,Testbed为T2类,ADS为T3类。T3类工具必须进行安全性分析,并针对其可能带来的安全风险提供规避措施。

2.1 ADS风险分析

ADS带来的风险如下。

1)ARM C编译器和ARM C链接器生成的目标文件逻辑不正确(目标文件逻辑上不符合程序源代码的描述)。

2)ARM C编译器和ARM C链接器在生成的目标文件中人为地插入恶意代码,导致目标程序运行不可靠或达到某些其他恶意目的。

3)AXD在将目标文件烧写至ARM芯片时发生错误,芯片中运行的程序与目标文件逻辑上不一致。

2.2 规避措施

1)使用强类型语言或非强类型语言的安全子集

在DS6-60中使用C语言做为编程语言。C语言属于非强类型语言,很灵活,却有很多陷阱。C语言有很多依赖于编译器的未定义的行为。如:数据类型及对齐方式、数据在内存的储存方式等。

SPSS21.0统计软件分析数据,用χ2检验计数资料组间率,计数资料用例数[n(%)]表示,P<0.05为差异具统计意义。

* ADS开发环境C编译器以上行为分析如表1所示。

表1 ARM C编译器数据类型的大小和对齐

* ARM C编译器既支持大端模式,也支持小端模式,默认为小端模式。

通过以上对编译器某些行为的分析,故障安全平台的软件开发,在C语言的使用上尽可能少使用与编译器相关的行为,使其尽可能的安全可控。如迫不得已使用时,应明确编译器对应行为的处理方式,并应将其文档化。如数据类型的转换,必须强制转换,而不是通过编译器隐式转换;如有可能会导致内存溢出的strcpy/memcpy等库函数,在使用时需格外小心,保证不会发生内存溢出。在DS6-60开发中,使用符合MIRSA C 2004且对C语言有更多约束的C语言安全子集。

2)采取二取二的安全比较机制,双CPU在运行中比较逻辑的输入和输出值,如不一致,做故障处理。

3)双CPU采用不同编译器,防止共模错误。

3 防护技术三:防御性编程

数据溢出、指针非法、关键数据被改写这些安全性问题经常困扰着软件开发工程师,一旦发生,排查问题需要花费很多的时间和精力。防御性编程的使用可以大大增加软件设计的安全性。顾名思义,防御性编程是一种细致、谨慎的编程方法。防御性编程的目标是通过处理已知的由硬件随机性故障或软件系统性故障引起的软件故障,从而提供软件健壮性。

下面从两个方面来说明防御性编程:一方面是故障检测;另一方面是错误检测。

3.1 故障检测

Fun(UINT8_T * pSrc)

{

UINT8_T temp;

temp = g_num ;

}

在段代码中,pSrc指针没有任何防护,局部变量也未初始化,局部变量如果不做显性的初始化,局部变量的初始值是不确定的,完全依赖于编译器。关键全局变量g_num未做防护。

修改后的代码如下。

Fun(const UINT8_T * pSrc)

{

/*参数合法性校验*/

if(pSrc != NULL)

{

UINT8_T temp = 0U;/*无符号型的常量加U*/

/*关键全局变量合法性校验*/

if (g_num <= MAX_NUM)/*MAX_NUM 为g_num的最大合法值*/

{

temp = g_num ;

}

else

{

…/*全局变量不合法故障处理*/

}

}

else

{

…/*参数不合法故障处理*/

}

}

这里说明一点,并不推荐对系统的所有全局数据进行合法性校验,但是关键全局数据在使用前应加以校验。当然故障检测除了范围的检测,还有资源上的防护等。比如在软件中对关键静态变量做周期性的校验,防止关键静态数据被非法改写。在多任务的程序设计中,应当慎用共享变量进行各任务间数据交换。因为CPU对多任务程序进行调度执行时可能造成数据不一致。确需使用共享变量时应当作为临界资源保护起来,以控制对该临界资源的互斥访问。

比如操作系统与应用软件之间的防护关系:一方面操作系统如何保护应用软件,包括调度和内存等资源管理,并保证不同应用软件运行之间不会冲突等;另一方面应用软件故障/异常行为不会影响操作系统的正常工作。这些在设计阶段都需要考虑。

3.2 错误检测

这里所说的错误检测专指检测通信会话中出现的数据丢失或损坏。一般经常使用的检测方法为:奇偶校验位、校验和、循环冗余校验码等。一般采用检错重发技术。

4 结论

采用二取二安全机制时,需要考虑很多故障场景,以便实现真正意义上的二取二;工具安全性分析,不容易被重视,却最终可能会导致故障安全平台发生所谓的“诡异”问题,编译器、链接器等工具可能带来的风险需要增加防护;防御性编程可以提高软件的健壮性,对于使用类似C语言的非强类型语言,建议在使用中对C语言的行为做出约束,使C语言的行为更加安全可控。

除了上述3种安全防护措施,在故障安全平台研发中,可能还会用到其他的安全防护措施,系统根据自身的特点,选用适合本系统的安全防护技术,最终使故障安全平台安全可靠的运行。

[1] EN50128:2011铁路应用:通信、信号和处理系统 铁路控制和防护系统用软件[S].

[2] EN50129:2003铁路应用:铁路控制系统领域的安全相关电子系统[S].

猜你喜欢

编译器C语言编程
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
基于Visual Studio Code的C语言程序设计实践教学探索
纺织机上诞生的编程
基于相异编译器的安全计算机平台交叉编译环境设计
运行速度大突破华为《方舟编译器》详解
51单片机C语言入门方法
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索