CN115617352B - 基于安全编码标准的c代码检测方法、设备和存储介质 - Google Patents
基于安全编码标准的c代码检测方法、设备和存储介质 Download PDFInfo
- Publication number
- CN115617352B CN115617352B CN202211532718.6A CN202211532718A CN115617352B CN 115617352 B CN115617352 B CN 115617352B CN 202211532718 A CN202211532718 A CN 202211532718A CN 115617352 B CN115617352 B CN 115617352B
- Authority
- CN
- China
- Prior art keywords
- code
- coding standard
- lexical
- analysis
- sub
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及数据处理领域,公开了一种基于安全编码标准的C代码检测方法、设备和存储介质。包括:接收用户设置的代码目录,并根据代码目录确定头文件的Include目录;接收用户设置的Define开关信息以及基于安全编码标准的解析规则,其中,所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则;将所述头文件的Include目录、Define开关信息以及所述解析规则保存为第一工程文件;对待检测的第一目标代码进行词法语义分析,获得分析结果;至少基于分析结果以及第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果。本实施例提高了安全编码标准的覆盖率,进而提高检测效率。
Description
技术领域
本发明涉及数据处理领域,尤其涉及一种基于安全编码标准的C代码检测方法、设备和存储介质。
背景技术
基于安全编码标准的代码检测是一种基于语义与语法分析技术的典型实践。在汽车电子软件开发领域,安全编码标准的意义在于在软件开发初期,实现开发代码的合规性与标准一致性。
通过检测软件开发人员编写的代码是否符合安全标准,有着快速修复可能存在的软件缺陷,提高协同开发效率的重大的意义。
有鉴于此,特提出本发明。
发明内容
为了解决上述技术问题,本发明提供了一种基于安全编码标准的C代码检测方法、设备和存储介质,提高了安全编码标准的覆盖率,进而提高了检测效率。
本发明实施例提供了一种基于安全编码标准的C代码检测方法,该方法包括:
接收用户设置的代码目录,并根据所述代码目录确定头文件的Include目录;
接收用户设置的Define开关信息以及基于安全编码标准的解析规则,其中,所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则;
将所述头文件的Include目录、所述Define开关信息以及所述解析规则保存为第一工程文件;
对待检测的第一目标代码进行词法语义分析,获得分析结果;
至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果。
本发明实施例提供了一种电子设备,所述电子设备包括:
处理器和存储器;
所述处理器通过调用所述存储器存储的程序或指令,用于执行任一实施例所述的基于安全编码标准的C代码检测方法的步骤。
本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储程序或指令,所述程序或指令使计算机执行任一实施例所述的基于安全编码标准的C代码检测方法的步骤。
本发明实施例具有以下技术效果:
支持用户自主设置基于安全编码标准的解析规则,且所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则,从而提高了安全编码标准的覆盖率,在进行基于安全编码标准的C代码检测时可提高检测效率。具体的,首先,接收用户设置的代码目录,并根据所述代码目录确定头文件的Include目录;接收用户设置的Define开关信息以及基于安全编码标准的解析规则,其中,所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则;将所述头文件的Include目录、所述Define开关信息以及所述解析规则保存为第一工程文件;对待检测的第一目标代码进行词法语义分析,获得分析结果;至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种基于安全编码标准的C代码检测方法的流程图;
图2是本发明实施例提供的一种对待检测的第一目标代码进行词法语义分析的流程图;
图3是本发明实施例提供的一种基于安全编码标准的C代码检测方法的流程图;
图4为本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的技术方案进行清楚、完整的描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施例,都属于本发明所保护的范围。
本发明实施例提供的基于安全编码标准的C代码检测方法可以由电子设备执行。图1是本发明实施例提供的一种基于安全编码标准的C代码检测方法的流程图。参见图1,该基于安全编码标准的C代码检测方法具体包括如下步骤:
S110、接收用户设置的代码目录,并根据所述代码目录确定头文件的Include目录。
具体的,用户根据待检测的或者说是需要解析的代码文件选择和设置源代码文件目录,通过遍历源代码文件目录下的所有头文件(.h文件),自动生成包含头文件的目录,将包含头文件的目录自动设置成头文件的Include目录,以便后续解析源代码里的Include文件信息时,能够快速查找到对应的头文件。
S120、接收用户设置的Define开关信息以及基于安全编码标准的解析规则,其中,所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则。
其中,用户可以自行设置Define开关信息,以将其不想对外开放的代码屏蔽掉。
在汽车电子软件开发领域,安全编码标准的意义在于在软件开发初期,实现开发代码的合规性与标准一致性。通过检测软件开发人员编写的代码是否符合安全标准,有着快速修复可能存在的软件缺陷,提高协同开发效率的重大的意义。
一种安全编码标准可适用于多种应用场景,因此若想实现完整检测或者说若想提高检测覆盖度,需针对每种应用场景设计问题场景下的子规则。比如,MISRA标准的2.2规定:不得有无效代码(dead code)
而实际情况会有很多种,比如
extern volatile uint16_t v;
extern char *p;
void f ( void ){
( int32_t ) v; ->违规,无效代码
v >> 3; ->违规,无效代码
*p++; ->违规,无效代码
( *p )++; ->正确
}。
因此,通过针对每种应用场景设计问题场景下的子规则,可提高检测的覆盖面,进而实现全面检测,提高检测效率与检测精度。示例性的,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则;该子规则用于检测用户开发的源代码是否是按照某种安全编码标准进行开发的,有助于实现开发代码的合规性与标准一致性,以及有着快速修复可能存在的软件缺陷,提高协同开发效率的重大的意义。
S130、将所述头文件的Include目录、所述Define开关信息以及所述解析规则保存为第一工程文件。
S140、对待检测的第一目标代码进行词法语义分析,获得分析结果。
示例性的,所述对待检测的第一目标代码进行词法语义分析,获得分析结果,包括如下步骤:
141、在对所述第一目标代码进行编译时,利用设定的界定符库中的界定符对所述第一目标代码进行词法分割,获得分割后的各词法单元。
其中,不同种类的编程语言(例如C语言、JAVA语言)中的界定符不同。界定符例如是/*,*/等符号。通过利用界定符与第一目标代码中的每个代码进行匹配,可以识别每个词法单元。具体的,参考如图2所示的一种对待检测的第一目标代码进行词法语义分析的流程图,具体的,逐个字符读取第一目标代码,直至读取到空格或者界定符,将读取的内容确定为一个词法单元,即一个token;然后将词法单元里的代码内容与关键字库里的内容进行文本匹配,获得各词法单元的语义即token信息,token信息包括所属文件,位置,作用域,前token,后token,类型,原始字符串等信息,将各词法单元的语义即token信息保存为xml文件,进而获得Dump文件。
142、针对各词法单元,将词法单元里的代码内容与关键字库里的内容进行文本匹配,获得各词法单元的语义。
词法单元的语义具体可以是关键字、标识符、运算符、分隔符、预处理及注释语句等。例如,若某词法单元的文本为“if”,则其语义为“关键字”,若某词法单元的文本为“{”,则其语义为“分隔符”。若前一个词法单元的文本是“+”,当前词法单元也是“+”,则代表是自增操作符,此时需将前一个词法单元以及当前词法单元合并为一个词法单元“++”。在例如,若当前词法单元的文本为“}”,其代表一个作用域a的结束,则与当前词法单元相邻的后一个词法单元的作用域应设定为作用域a的上层域。综上,各词法单元的语义还可以包括作用域的相关信息。
143、根据各词法单元的语义确定所述分析结果。
可选的,至少将各词法单元的语义确定为所述分析结果,换言之,所述分析结果除了包括各词法单元的语义之外,还包括其它内容。
进一步的,所述对待检测的第一目标代码进行词法语义分析,获得分析结果,还包括:
针对各词法单元,将词法单元里的代码内容与所述第一工程文件中的所述Define开关信息进行比较,识别词法单元是否为Define定义,如果词法单元为Define定义,将词法单元的类型确定为Define;
例如,用户设置了一个Define值为“NOSIGNAL”,而当前词法单元的原始字符串也为“NOSIGNAL”,则判定当前词法单元的类型为Define定义。
对应的,所述根据各词法单元的语义确定所述分析结果,包括:
将词法单元的语义以及类型确定为对应词法单元的分析信息;
将各词法单元的分析信息确定为所述分析结果。
S150、至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果。
示例性的,所述至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果,包括如下步骤:
151、确定所述第一目标代码头部的include文件是否在所述第一工程文件中,如果没有,则报告错误信息。
152、根据所述第一工程文件中的所述Define开关信息跳过被Define关掉的代码段。
例如,用户设置了一个Define开关信息,其值为“NOSIGNAL”,那么第一目标代码中位于#ifdef NOSIGNAL与#endif之间的代码则是有效代码,属于本次检测的对象;而第一目标代码中位于#ifndef NOSIGNAL与#endif之间的代码则是无效代码,不属于本次检测的对象。
通过支持用户设置Define开关信息,可灵活地划分哪些代码段是需要被检测的,哪些代码段是不需要被检测的。
153、针对未被Define关掉的代码段中各词法单元的分析信息,根据所述第一工程文件中的所述解析规则进行遍历,以根据所述解析规则验证各词法单元以及各词法单元所属的作用域是否符合安全编码标准要求。
例如,MISRA标准的2.2规定:不得有无效代码(dead code)
而实际情况会出现如下代码:
extern volatile uint16_t v;
extern char *p;
void f ( void ){
( int32_t ) v; ->违规,无效代码
v >> 3; ->违规,无效代码
*p++; ->违规,无效代码
( *p )++; ->正确
}。
通过根据所述解析规则对代码进行解析检测,可以验证各词法单元是否符合安全编码标准要求。
154、若词法单元或者词法单元所属的作用域中的任意之一不符合安全编码标准要求,则确定词法单元不符合安全编码标准要求.
155、根据不符合安全编码标准要求的词法单元所在的代码文件以及行列位置确定所述检测结果。
可选的,将不符合安全编码标准要求的词法单元所在的代码文件以及行列位置确定为所述检测结果。
进一步的,所述方法还包括:
将所述第一目标代码、所述第一工程文件、所述分析结果以及所述检测结果进行存储。
在接收到对待检测的第二目标代码进行安全编码标准检测的命令时,将针对所述第二目标代码的第二工程文件与所述第一工程文件进行比对,若两者之间的相似度达到阈值,则将所述检测结果作为所述第二目标代码的检测结果,其中,所述第二工程文件中包括针对所述第二目标代码的头文件的Include目录、Define开关信息以及解析规则。如此,可极大地提高后续相似代码的检测效率,由于代码版本更新迭代较快,通过该种方式可提高整体的代码检测效率,进而提高代码开发效率。
进一步的,还包括:
接收用户设置的输出报告的模板信息以及格式信息;
按照所述模板信息以及格式信息将所述检测结果进行输出。
通过支持用户自定义设置输出报告的模板信息以及格式信息,可为用户个性化地输出让用户满意的检测结果或者说是检测报告。
进一步的,所述对待检测的第一目标代码进行词法语义分析,获得分析结果之后,还包括:
若所述分析结果中包括预设信息,基于所述分析结果显示提示信息,所述提示信息中包括所述第一目标代码所违反的安全编码标准以及所述所违反的安全编码标准的内容;响应于触发所述提示信息的操作,显示分词粒度的违规原因、修改提示以及符合所述所违反的安全编码标准的代码范例。
其中,所述预设信息是第一目标代码存在问题的信息,例如可以是警告或者错误。通过显示所述第一目标代码所违反的安全编码标准以及所述所违反的安全编码标准的内容,可辅助开发人员规范代码的合规性与标准一致性,引导开发人员编写符合安全标准的代码,有着快速修复可能存在的软件缺陷,提高协同开发效率的重大的意义。通过显示分词粒度的违规原因、修改提示以及符合所述所违反的安全编码标准的代码范例,可方便代码开发人员对违规的代码进行修改,降低了修改难度,提高了开发效率。
具体的,所述问题场景包括但不限于对象声明场景、函数类型声明场景、类型定义的隐式声明场景和类型定义的显式声明场景;通过预先设置多种问题场景,可实现对第一目标代码更全方面的检测验证,有助于规范代码的合规性与标准一致性,有着快速修复可能存在的软件缺陷,提高协同开发效率的重大的意义。
所述根据所述第一工程文件中的所述解析规则进行遍历,以根据所述解析规则验证各词法单元以及各词法单元所属的作用域是否符合安全编码标准要求,包括:
依次利用所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则对目标单元的代码进行解析匹配,若所述目标单元的代码与所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则中的任意一个均不匹配,则确定所述目标单元符合安全编码标准要求,其中,所述目标单元为所述各词法单元中的任意一个;
依次利用所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则对所述目标单元的作用域内的代码进行解析匹配,若所述目标单元的作用域内的代码与所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则中的任意一个均不匹配,则确定所述目标单元的作用域符合安全编码标准要求。
进一步的,所述解析规则还可以包括自定义规则,每条自定义规则都通过继承解析接口将自身注册为一个解析器,加入到解析器列表;
所述方法还包括:
扫描所有注册的解析器,逐个调用每个解析器对词法单元内的代码进行解析,以验证词法单元是否符合自定义要求;所述逐个调用每个解析器对词法单元内的代码进行解析,包括:
判断词法单元内的一行代码的语句类型,根据该语句类型确定需要匹配的模板列表;基于所述模板列表中各模板中的正则表达式对所述一行代码中的代码逐个进行匹配,获得匹配结果;
和/或,判断词法单元内的一行代码的语句类型,根据该语句类型确定支持的属性,根据所述属性的类型对所述一行代码进行解析,获得解析结果;所述匹配结果以及所述解析结果用于确定词法单元是否符合自定义要求。
具体的,自定义规则可以包括两类,一类为单纯文本规则,一类为语义规则。单纯文本规则是指验证代码是否符合规定的格式的规则。例如,符号“=”左右是否有空格,“if”后是否有括号等。单纯文本规则通过导入自定义模板实现。针对C语言代码的五种类型的语句(表达式语句,函数调用语句,控制语句,复合语句,空语句),每种类型支持多个模板。解析时,首先判断一行代码的语句类型,来找到需要匹配的模板列表。然后通过正则表达式逐个匹配代码文本,如果全部不符合,则判定该行代码为违规代码。
语义规则是指针对C语言代码的五种类型的语句(表达式语句,函数调用语句,控制语句,复合语句,空语句)进行语义上校验的规则。每种语句类型的规则支持不同的属性,最终通过校验属性的值来实现语义上的验证。各种类型语句的属性为预先在程序中定义好的基础内容。
例如:
表达式语句
属性1:深度,类型为数值,
属性2:参与运算的变量个数,类型为数值
控制语句
属性1:控制语句类型(if/while/for)标志,类型为数值
属性2:循环次数,类型为数值
针对文本类型的属性,支持用户输入正则表达式。针对数值类型的属性,支持大小比较,上下限设定等校验方式。
当确定语句类型时,自动带出其支持的属性,然后根据属性的类型,选择校验的方法。例如,定义一条规则,表达式语句中的赋值操作,其参与计算的变量个数小于5个。一套完整的自定义规则可包含多条,形成一个类似于程序的文本。
进一步的,针对于MISRA标准,利用以往在汽车电子研发的经验,预设多种问题场景下的子规则,以在对第一目标代码进行解析检测时,对第一目标代码实现更全面的检测,提高了针对MISRA标准中“不可判定”的规则(即无法在实际运行前准确判定是否违规)的检测能力。在MISRA规则中的22条不可判定的规则中,有15条可以进行部分解析。提示代码违规的风险等级,并给出相应的解释以及修改建议。
具体的,针对不同的不可判定规则,根据以往的开发经验,提取出对应的可判定的逻辑。实现手段与规则密切相关,是既往经验积累的体现。比如MISRA标准中的14.2 (for循环应为良好格式),根据以往经验,设置了多种for循环不良好格式的样例,解析时,通过将代码与非良好格式的样例进行匹配来提供解析结果,完全匹配则风险等级最高,部分匹配则风险等级较低。又比如MISRA标准中的2.2(不得有无效代码),其中对于运算结果有没有使用的判定,根据经验设置了多种运算结果无使用的样例,解析时通过将代码与样例进行匹配提示违规的风险。再比如MISRA标准中的规则17.2(函数不得直接或间接调用自身),直接调用自身可以直接判断,针对间接调用,由于内存和处理器的限制,不可能实现无限深度的校验,故可以定义一个校验间接调用的最大深度,如果设为5,则会判断在5层调用之内会调用到自身的违规信息。
概括性的,所述基于所述安全编码标准预设的多种问题场景下的子规则包括:与MISRA标准中的14.2对应的for循环样例,与MISRA标准中的2.2对应的运算结果没被使用的样例以及与MISRA标准中的17.2对应的函数不得直接或间接调用自身的样例,针对间接调用自身的样例中设置有调用深度,在对代码进行解析检测时,对调用深度进行校验,比如调用深度为5,若在5次连续调用内没有调用自身,则确定代码合规。
在上述技术方案的基础上,参考如图3所示的一种基于安全编码标准的C代码检测方法的流程图,具体的,解析管理器从第一工程文件中读取头文件的Include目录、所述Define开关信息以及所述解析规则,然后调用与解析规则匹配的解析器对第一目标代码的词法语义分析结果(即Dump文件)进行解析处理,并按照模板输出违规信息报告。
本实施例具有以下技术效果:支持用户自主设置基于安全编码标准的解析规则,且所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则,从而提高了安全编码标准的覆盖率,在进行基于安全编码标准的C代码检测时可提高检测效率。具体的,首先,接收用户设置的代码目录,并根据所述代码目录确定头文件的Include目录;接收用户设置的Define开关信息以及基于安全编码标准的解析规则,其中,所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则;将所述头文件的Include目录、所述Define开关信息以及所述解析规则保存为第一工程文件;对待检测的第一目标代码进行词法语义分析,获得分析结果;至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果
图4为本发明实施例提供的一种电子设备的结构示意图。如图4所示,电子设备400包括一个或多个处理器401和存储器402。
处理器401可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备400中的其他组件以执行期望的功能。
存储器402可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器401可以运行所述程序指令,以实现上文所说明的本发明任意实施例的基于安全编码标准的C代码检测方法以及/或者其他期望的功能。在所述计算机可读存储介质中还可以存储诸如初始外参、阈值等各种内容。
在一个示例中,电子设备400还可以包括:输入装置403和输出装置404,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。该输入装置403可以包括例如键盘、鼠标等等。该输出装置404可以向外部输出各种信息,包括预警提示信息、制动力度等。该输出装置404可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。
当然,为了简化,图4中仅示出了该电子设备400中与本发明有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备400还可以包括任何其他适当的组件。
除了上述方法和设备以外,本发明的实施例还可以是计算机程序产品,其包括计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本发明任意实施例所提供的基于安全编码标准的C代码检测方法的步骤。
所述计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本发明实施例操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。
此外,本发明的实施例还可以是计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本发明任意实施例所提供的基于安全编码标准的C代码检测方法的步骤。
所述计算机可读存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以包括但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
需要说明的是,本发明所用术语仅为了描述特定实施例,而非限制本申请范围。如本发明说明书和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法或者设备中还存在另外的相同要素。
还需说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。除非另有明确的规定和限定,术语“安装”、“相连”、“连接”等应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案。
Claims (7)
1.一种基于安全编码标准的C代码检测方法,其特征在于,包括:
接收用户设置的代码目录,并根据所述代码目录确定头文件的Include目录;
接收用户设置的Define开关信息以及基于安全编码标准的解析规则,其中,所述安全编码标准至少包括MISRA标准和ISO/IEC TS 17961 C,所述解析规则包括基于所述安全编码标准预设的多种问题场景下的子规则;
将所述头文件的Include目录、所述Define开关信息以及所述解析规则保存为第一工程文件;
对待检测的第一目标代码进行词法语义分析,获得分析结果;
至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果;
所述至少基于所述分析结果以及所述第一工程文件对所述第一目标代码进行安全编码标准检测,获得检测结果,包括:
确定所述第一目标代码头部的include文件是否在所述第一工程文件中,如果没有,则报告错误信息;
根据所述第一工程文件中的所述Define开关信息跳过被Define关掉的代码段;
针对未被Define关掉的代码段中各词法单元的分析信息,根据所述第一工程文件中的所述解析规则进行遍历,以根据所述解析规则验证各词法单元以及各词法单元所属的作用域是否符合安全编码标准要求;
若词法单元或者词法单元所属的作用域中的任意之一不符合安全编码标准要求,则确定词法单元不符合安全编码标准要求;
根据不符合安全编码标准要求的词法单元所在的代码文件以及行列位置确定所述检测结果;
所述解析规则还包括自定义规则,每条自定义规则都通过继承解析接口将自身注册为一个解析器,加入到解析器列表;一套完整的自定义规则包含多条,形成程序文本;
所述基于所述安全编码标准预设的多种问题场景下的子规则包括:与MISRA标准中的14.2对应的for循环样例,解析时,通过将代码与样例进行匹配来提供解析结果,完全匹配则风险等级最高,部分匹配则风险等级较低;与MISRA标准中的2.2对应的运算结果没被使用的样例,解析时通过将代码与样例进行匹配提示违规的风险;以及与MISRA标准中的17.2对应的函数不得直接或间接调用自身的样例,针对间接调用自身的样例中设置有调用深度;
将所述第一目标代码、所述第一工程文件、所述分析结果以及所述检测结果进行存储;
在接收到对待检测的第二目标代码进行安全编码标准检测的命令时,将针对所述第二目标代码的第二工程文件与所述第一工程文件进行比对,若两者之间的相似度达到阈值,则将所述检测结果作为所述第二目标代码的检测结果,其中,所述第二工程文件中包括针对所述第二目标代码的头文件的Include目录、Define开关信息以及解析规则。
2.根据权利要求1所述的方法,其特征在于,所述对待检测的第一目标代码进行词法语义分析,获得分析结果,包括:
在对所述第一目标代码进行编译时,利用设定的界定符库中的界定符对所述第一目标代码进行词法分割,获得分割后的各词法单元;
针对各词法单元,将词法单元里的代码内容与关键字库里的内容进行文本匹配,获得各词法单元的语义;
针对各词法单元,将词法单元里的代码内容与所述第一工程文件中的所述Define开关信息进行比较,识别词法单元是否为Define定义,如果词法单元为Define定义,将词法单元的类型确定为Define;
将词法单元的语义以及类型确定为对应词法单元的分析信息;
将各词法单元的分析信息确定为所述分析结果。
3.根据权利要求1所述的方法,其特征在于,所述问题场景包括对象声明场景、函数类型声明场景、类型定义的隐式声明场景和类型定义的显式声明场景;
所述根据所述第一工程文件中的所述解析规则进行遍历,以根据所述解析规则验证各词法单元以及各词法单元所属的作用域是否符合安全编码标准要求,包括:
依次利用所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则对目标单元的代码进行解析匹配,若所述目标单元的代码与所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则中的任意一个均不匹配,则确定所述目标单元符合安全编码标准要求,其中,所述目标单元为所述各词法单元中的任意一个;
依次利用所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则对所述目标单元的作用域内的代码进行解析匹配,若所述目标单元的作用域内的代码与所述对象声明场景下的子规则、所述函数类型声明场景下的子规则、所述类型定义的隐式场景下的子规则和所述类型定义的显式声明场景下的子规则中的任意一个均不匹配,则确定所述目标单元的作用域符合安全编码标准要求。
4.根据权利要求2所述的方法,其特征在于,
所述方法还包括:
扫描所有注册的解析器,逐个调用每个解析器对词法单元内的代码进行解析,以验证词法单元是否符合自定义要求;所述逐个调用每个解析器对词法单元内的代码进行解析,包括:
判断词法单元内的一行代码的语句类型,根据该语句类型确定需要匹配的模板列表;基于所述模板列表中各模板中的正则表达式对所述一行代码中的代码逐个进行匹配,获得匹配结果;
和/或,判断词法单元内的一行代码的语句类型,根据该语句类型确定支持的属性,根据所述属性的类型对所述一行代码进行解析,获得解析结果;所述匹配结果以及所述解析结果用于确定词法单元是否符合自定义要求。
5.根据权利要求1所述的方法,其特征在于:
接收用户设置的输出报告的模板信息以及格式信息;
按照所述模板信息以及格式信息将所述检测结果进行输出;
所述对待检测的第一目标代码进行词法语义分析,获得分析结果之后,还包括:
若所述分析结果中包括预设信息,基于所述分析结果显示提示信息,所述提示信息中包括所述第一目标代码所违反的安全编码标准以及所述所违反的安全编码标准的内容;
响应于触发所述提示信息的操作,显示分词粒度的违规原因、修改提示以及符合所述所违反的安全编码标准的代码范例。
6.一种电子设备,其特征在于,所述电子设备包括:
处理器和存储器;
所述处理器通过调用所述存储器存储的程序或指令,用于执行如权利要求1至5任一项所述的基于安全编码标准的C代码检测方法的步骤。
7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储程序或指令,所述程序或指令使计算机执行如权利要求1至5任一项所述的基于安全编码标准的C代码检测方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211532718.6A CN115617352B (zh) | 2022-12-02 | 2022-12-02 | 基于安全编码标准的c代码检测方法、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211532718.6A CN115617352B (zh) | 2022-12-02 | 2022-12-02 | 基于安全编码标准的c代码检测方法、设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115617352A CN115617352A (zh) | 2023-01-17 |
CN115617352B true CN115617352B (zh) | 2023-03-28 |
Family
ID=84879714
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211532718.6A Active CN115617352B (zh) | 2022-12-02 | 2022-12-02 | 基于安全编码标准的c代码检测方法、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115617352B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117406996B (zh) * | 2023-10-20 | 2024-04-16 | 北京市辰至半导体科技有限公司 | 硬件描述代码的语义分析方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012991A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于静态分析的c语言安全规则检查方法 |
CN107943481A (zh) * | 2017-05-23 | 2018-04-20 | 清华大学 | 基于多模型的c语言程序代码规范构造方法 |
CN114968807A (zh) * | 2022-06-16 | 2022-08-30 | 康键信息技术(深圳)有限公司 | 代码检测方法、装置、电子设备及可读存储介质 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10312312A (ja) * | 1997-05-13 | 1998-11-24 | Nippon Telegr & Teleph Corp <Ntt> | 仕様によって動作が変わるc言語の計算機プログラム検査処理方法およびプログラム記憶媒体 |
JP2007304840A (ja) * | 2006-05-11 | 2007-11-22 | Matsushita Electric Ind Co Ltd | コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム |
CN100461132C (zh) * | 2007-03-02 | 2009-02-11 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101697121A (zh) * | 2009-10-26 | 2010-04-21 | 哈尔滨工业大学 | 一种基于程序源代码语义分析的代码相似度检测方法 |
CN108205493B (zh) * | 2016-12-20 | 2021-07-06 | 腾讯科技(深圳)有限公司 | 一种代码检测方法、终端、服务器及系统 |
CN112579477A (zh) * | 2021-02-26 | 2021-03-30 | 北京北大软件工程股份有限公司 | 一种缺陷检测方法、装置以及存储介质 |
-
2022
- 2022-12-02 CN CN202211532718.6A patent/CN115617352B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012991A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于静态分析的c语言安全规则检查方法 |
CN107943481A (zh) * | 2017-05-23 | 2018-04-20 | 清华大学 | 基于多模型的c语言程序代码规范构造方法 |
CN114968807A (zh) * | 2022-06-16 | 2022-08-30 | 康键信息技术(深圳)有限公司 | 代码检测方法、装置、电子设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN115617352A (zh) | 2023-01-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9465593B2 (en) | Method and apparatus for testing browser compatibility | |
US10146532B2 (en) | Apparatus and method for detecting code cloning of software | |
US20120297362A1 (en) | Editing source code | |
CN115617352B (zh) | 基于安全编码标准的c代码检测方法、设备和存储介质 | |
CN111459500A (zh) | 基于海鹰翼辉操作系统的安全编译方法及装置 | |
US9715372B2 (en) | Executable guidance experiences based on implicitly generated guidance models | |
CN117113347A (zh) | 一种大规模代码数据特征提取方法及系统 | |
CN110286912B (zh) | 代码检测方法、装置及电子设备 | |
CN115904989A (zh) | 一种接口测试方法、装置、设备及可读存储介质 | |
CN113885876A (zh) | 一种参数校验方法、装置、存储介质及计算机系统 | |
CN113778852A (zh) | 一种基于正则表达式的代码分析方法 | |
CN112632333A (zh) | 查询语句生成方法、装置、设备及计算机可读存储介质 | |
CN115495745B (zh) | 一种基于风险函数的工业软件源代码静态检测方法及系统 | |
US20060282820A1 (en) | COBOL syntax for native XML file parsing and file generation | |
CN112286784A (zh) | 一种测试用例生成方法、装置、服务器及存储介质 | |
CN115237753A (zh) | 固件排错方法、系统、终端设备及存储介质 | |
CN115658030A (zh) | 代码处理方法、装置和电子设备 | |
KR20090011974A (ko) | 컴파일 대상 파일 추출 방법 | |
CN110765003B (zh) | 代码检测方法、装置以及设备、存储介质 | |
CN114691197A (zh) | 代码分析方法、装置、电子设备和存储介质 | |
CN114895914A (zh) | 日志输出代码的生成方法、装置、电子设备及存储介质 | |
CN111027073A (zh) | 漏洞检测方法、装置、设备及存储介质 | |
US9880981B2 (en) | Automatically detecting the ability to execute processing logic after a parser or validation error | |
CN111475403A (zh) | 测试脚本的动态生成方法及相关装置 | |
Reid et al. | Using the TypeScript compiler to fix erroneous Node. js snippets |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |