掌桥专利:专业的专利平台
掌桥专利
首页

一种代码扫描方法、装置、设备及存储介质

文献发布时间:2023-06-19 09:38:30


一种代码扫描方法、装置、设备及存储介质

技术领域

本申请涉及计算机应用技术领域,特别是涉及一种代码扫描方法、装置、设备及存储介质。

背景技术

随着计算机技术的快速发展,对于软件应用安全的关注程度越来越高,代码扫描作为常用的软件应用安全解决方案之一,受到的关注程序也越来越高。所谓代码扫描是指在软件工程中,在程序员写好代码后,通过一定手段对其进行扫描,找出代码当中存在的一些语义缺陷、安全漏洞等。

目前,多是由技术人员通过人工方式进行代码扫描,扫描效率较低,而且,在进行代码扫描过程中,扫描结果的准确性依赖于技术人员的经验,无法有效保障。

发明内容

本申请的目的是提供一种代码扫描方法、装置、设备及存储介质,以提高代码扫描效率和准确性。

为解决上述技术问题,本申请提供如下技术方案:

一种代码扫描方法,包括:

在达到设定的代码扫描触发条件时,启动扫描任务;

针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码;

对拉取到的代码进行编译,获得编译结果;

调用扫描工具对所述编译结果进行扫描,生成扫描结果。

在本申请的一种具体实施方式中,所述启动扫描任务,包括:

确定待进行代码扫描的底层模块;

按照所述底层模块的代码特点启动扫描任务。

在本申请的一种具体实施方式中,所述底层模块包括公用模块和非公用模块,所述按照所述底层模块的代码特点启动扫描任务,包括:

针对公用模块,为使用同一个代码分支的公用模块启动一个扫描任务,为使用不同代码分支的公用模块启动不同的扫描任务;

针对非公用模块,为每个非公用模块分别启动一个扫描任务。

在本申请的一种具体实施方式中,在所述调用扫描工具对所述编译结果进行扫描之前,还包括:

调用扫描工具在代码构建过程中收集数据;

所述调用扫描工具对所述编译结果进行扫描,包括:

调用扫描工具对收集到的数据和所述编译结果进行扫描分析。

在本申请的一种具体实施方式中,在所述启动扫描任务之前,还包括:

创建用于访问分布式版本控制系统git并安装有所述扫描工具的Linux环境。

在本申请的一种具体实施方式中,在所述生成扫描结果之后,还包括:

将所述扫描结果上传到扫描平台,以使用户通过登陆所述扫描平台查看所述扫描结果。

在本申请的一种具体实施方式中,在所述将所述扫描结果上传到扫描平台之后,还包括:

在接收到导出指令时,在所述扫描平台导出所述扫描结果。

一种代码扫描装置,包括:

扫描任务启动单元,用于在达到设定的代码扫描触发条件时,启动扫描任务;

代码拉取单元,用于针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码;

编译结果获得单元,用于对拉取到的代码进行编译,获得编译结果;

扫描结果生成单元,用于调用扫描工具对所述编译结果进行扫描,生成扫描结果。

一种代码扫描设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序时实现上述任一项所述代码扫描方法的步骤。

一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述代码扫描方法的步骤。

应用本申请实施例所提供的技术方案,在达到设定的代码扫描触发条件时,启动扫描任务,针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码,对拉取到的代码进行编译,获得编译结果,调用扫描工具对编译结果进行扫描,生成扫描结果。实现了根据CPU架构自动拉取代码、自动编译、自动扫描、自动生成扫描结果,可以减少代码扫描时间,节省扫描人力,提高了扫描效率,而且脱离对技术人员经验的依赖,准确性更高。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例中一种代码扫描方法的实施流程图;

图2为本申请实施例中一种代码扫描装置的结构示意图;

图3为本申请实施例中一种代码扫描设备的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面结合附图和具体实施方式对本申请作进一步的详细说明。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

参见图1所示,为本申请实施例所提供的一种代码扫描方法的实施流程图,该方法可以包括以下步骤:

S110:在达到设定的代码扫描触发条件时,启动扫描任务。

在本申请实施例中,可以根据实际情况预先设定代码扫描触发条件。如在接收到扫描指令时认为达到预先设定的代码扫描触发条件,或者在达到设定的扫描周期时认为达到预先设定的代码扫描触发条件。

在达到设定的代码扫描触发条件时,可以启动扫描任务,扫描任务可以预先创建好,启动的扫描任务可以有一个或多个。

在本申请的一种具体实施方式中,该步骤可以包括以下步骤:

步骤一:确定待进行代码扫描的底层模块;

步骤二:按照底层模块的代码特点启动目标扫描任务。

为便于描述,将上述两个步骤结合起来进行说明。

在本申请实施例中,在达到设定的代码扫描触发条件时,可以先确定待进行代码扫描的底层模块。当前代码扫描事件可能包括多个项目,多个项目包括多个底层模块。可以按照底层模块的代码特点启动扫描任务。

底层模块可以包括公用模块和非公用模块,按照底层模块的代码特点启动扫描任务,具体可以按照如下方式进行:

针对公用模块,可以为使用同一个代码分支的公用模块启动一个扫描任务,为使用不同代码分支的公用模块启动不同的扫描任务;针对非公用模块,为每个非公用模块分别启动一个扫描任务。

在实际应用中,同一产品可以包括多个项目,不同项目对应相同或不同产品,不同产品之间可能存在一些模块代码是公用的。在这些公用模块中,有的公用模块使用的代码是同一个代码分支,对于这类公用模块,可以启动一个扫描任务,该扫描任务供这类公用模块共用,有的公用模块使用的代码不是同一个分支,对于使用不同代码分支的公用模块可以启动不同的扫描任务,在实际应用中,再根据需要扫描的项目是哪一个产品来灵活决定执行哪个扫描任务。

在实际应用中,可以使用配置文件优化扫描脚本,优化扫描配置,合并脚本减少扫描任务数量。

S120:针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码。

在实际应用环境中,如在Jekins中,可以对每一个需要扫描的模块创建对应的扫描任务,在扫描任务的配置文件中可以指定模块的架构、代码分支等参数,代码分支指可以选择扫描代码的最新版本或者历史版本。

在达到设定的代码扫描触发条件时,启动扫描任务。启动的扫描任务可以是一个或多个。可以依次启动每个扫描任务或者同时调用多个线程启动多个扫描任务。针对每个扫描任务,在启动该扫描任务后,可以根据CPU架构拉取相应代码。

CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前使用比较多的是非国产化的X86架构,以及国产化的飞腾、龙芯等架构。

S130:对拉取到的代码进行编译,获得编译结果。

针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码,可以对拉取到的代码进行编译,获得编译结果。

S140:调用扫描工具对编译结果进行扫描,生成扫描结果。

对拉取到的代码进行编译,获得编译结果后,可以调用扫描工具对编译结果进行扫描,生成扫描结果。

在本申请的一种具体实施方式中,在调用扫描工具对编译结果进行扫描之前,还可以先调用扫描工具在代码构建过程中收集数据,然后在获得编译结果后,调用扫描工具对收集到的数据和编译结果进行扫描分析,生成扫描结果。

应用本申请实施例所提供的方法,在达到设定的代码扫描触发条件时,启动扫描任务,针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码,对拉取到的代码进行编译,获得编译结果,调用扫描工具对编译结果进行扫描,生成扫描结果。实现了根据CPU架构自动拉取代码、自动编译、自动扫描、自动生成扫描结果,可以减少代码扫描时间,节省扫描人力,提高了扫描效率,而且脱离对技术人员经验的依赖,准确性更高。

在本申请的一个实施例中,在生成扫描结果之后,还可以将扫描结果上传到扫描平台,以使用户通过登陆扫描平台查看扫描结果。

将扫描结果上传到扫描平台,用户登陆扫描平台,即可通过扫描平台的web端等查看扫描结果,以便根据扫描结果进行相应处理。

在将扫描结果上传到扫描平台之后,还可以在接收到导出指令时,在扫描平台导出扫描结果,以便进一步对扫描结果进行分析。

在本申请实施例中,在启动扫描任务之前,可以先创建用于访问分布式版本控制系统git并安装有扫描工具的Linux环境,以在这样的环境中进行相应操作。

在本申请实施例的具体实施过程中,可以利用Jekins的开源以及可扩展性,通过shell脚本,集成Coverity代码扫描工具,实现根据CPU架构自动拉取代码、自动编译、自动扫描、自动生成扫描结果。

Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。Jenkins可以很较好地支持各种语言,比如:java、c#、php等的项目构建,也完全兼容ant、maven、gradle等多种第三方构建工具,同时与svn、git可以无缝集成,也支持直接与源代码托管网站直接集成。

Coverity可以为用户提供先进的和可配置的用于检测软件缺陷和安全隐患的静态源代码分析解决方案。本申请中具体可以通过Coverity得到扫描工具。

Coverity的安装使用分两块,扫描平台platform和扫描工具Analysis。扫描平台可以接收、存储、展示扫描结果。扫描工具可以扫描代码,上传扫描结果至扫描平台。扫描结果可以在扫描平台的web端上查看,在需要导出时可以安装windows版的导出工具。

扫描工具的扫描结果的基本单位可以是“项目”和“流”,一个项目对应多个流,扫描结果的上传是以流为基本单位。“项目”可以理解为一个个的工程,“流”可以理解为某一次扫描结果。

在调用扫描工具对编译结果进行扫描时,可以按照模块导出结果,也可以将同一次扫描事件中的多个产品整体编译,最后导出整个扫描事件的结果。对于多个产品的研发过程来说,将不同模块的扫描结果放一个项目里方便导出但是不方便查看,放不同项目里,导出较麻烦,需要一个个单独导出。考虑到不同模块由不同开发组维护,分开扫描灵活性更高,可以单独扫描,即采用分模块扫描的方式,每个模块都有单独的扫描任务。

扫描工具的扫描分为B(uild)-A(nalysis)-C(ommit)几个步骤,即构建-分析-提交三步。

所谓构建,是指在代码构建的过程中收集数据;

所谓分析,是指扫描分析编译过程中的数据;

所谓提交,是指将扫描结果上传到扫描平台。

目前,在如基于K8S研发的底层平台系统等很多产品中,功能复杂多样,对应的底层模块也较多,反映到代码层次,对应的底层项目较多。每次打包发版都需要对各个工程分别打包成镜像,推送至镜像仓库,最后再整合成完整的安装包。

在这些产品中,除k8s、redis、influxdb等开源公共镜像外,不同产品还有多个业务镜像,打包镜像时,每个镜像都会根据CPU架构的不同生产多个镜像。如果这些镜像每次都手工打包、推送,再整合安装包,将会消耗大量时间和人力。

在这种情况下,可以引入Jekins,通过Jekins可以手动或定时执行拉取代码、打包、推送镜像等任务,节省大量时间和人力。

为代码安全考虑,可以引入代码扫描工具Coverity。该工具默认是windows版本,每次扫描都需要手动启动,后续的导出、分析都需要大量人力参与。在Linux系统下,Coverity只有简单的命令行式的扫描、上传结果的功能,不能完成完整的代码拉取、编译、扫描、生成扫描结果功能。

所以,本申请提出的技术方案,利用Jekins的开源以及可扩展性,通过shell脚本,集成Coverity代码扫描工具,可以实现根据CPU架构自动拉取代码、自动编译、自动扫描、自动生成扫描结果。提高了代码扫描效率和准确率。

相应于上面的方法实施例,本申请实施例还提供了一种代码扫描装置,下文描述的代码扫描装置与上文描述的代码扫描方法可相互对应参照。

参见图2所示,该装置可以包括单元:

扫描任务创建单元210,用于在达到设定的代码扫描触发条件时,启动扫描任务;

代码拉取单元220,用于针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码;

编译结果获得单元230,用于对拉取到的代码进行编译,获得编译结果;

扫描结果生成单元240,用于调用扫描工具对编译结果进行扫描,生成扫描结果。

应用本申请实施例所提供的装置,在达到设定的代码扫描触发条件时,启动扫描任务,针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码,对拉取到的代码进行编译,获得编译结果,调用扫描工具对编译结果进行扫描,生成扫描结果。实现了根据CPU架构自动拉取代码、自动编译、自动扫描、自动生成扫描结果,可以减少代码扫描时间,节省扫描人力,提高了扫描效率,而且脱离对技术人员经验的依赖,准确性更高。

在本申请的一种具体实施方式中,扫描任务创建单元210,用于:

确定待进行代码扫描的底层模块;

按照底层模块的代码特点启动扫描任务。

在本申请的一种具体实施方式中,底层模块包括公用模块和非公用模块,扫描任务创建单元210,用于:

针对公用模块,为使用同一个代码分支的公用模块启动一个扫描任务,为使用不同代码分支的公用模块启动不同的扫描任务;

针对非公用模块,为每个非公用模块分别启动一个扫描任务。

在本申请的一种具体实施方式中,还包括数据收集单元,用于:

在调用扫描工具对编译结果进行扫描之前,调用扫描工具在代码构建过程中收集数据;

扫描结果生成单元240,用于:

调用扫描工具对收集到的数据和编译结果进行扫描分析。

在本申请的一种具体实施方式中,还包括环境创建单元,用于:

在启动扫描任务之前,创建用于访问分布式版本控制系统git并安装有扫描工具的Linux环境。

在本申请的一种具体实施方式中,还包括扫描结果上传单元,用于:

在生成扫描结果之后,将扫描结果上传到扫描平台,以使用户通过登陆扫描平台查看扫描结果。

在本申请的一种具体实施方式中,还包括扫描结果导出单元,用于:

在将扫描结果上传到扫描平台之后,在接收到导出指令时,在扫描平台导出扫描结果。

相应于上面的方法实施例,本申请实施例还提供了一种代码扫描设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行计算机程序时实现上述代码扫描方法的步骤。

如图3所示,为代码扫描设备的组成结构示意图,代码扫描设备可以包括:处理器10、存储器11、通信接口12和通信总线13。处理器10、存储器11、通信接口12均通过通信总线13完成相互间的通信。

在本申请实施例中,处理器10可以为中央处理器(Central Processing Unit,CPU)、特定应用集成电路、数字信号处理器、现场可编程门阵列或者其他可编程逻辑器件等。

处理器10可以调用存储器11中存储的程序,具体的,处理器10可以执行代码扫描方法的实施例中的操作。

存储器11中用于存放一个或者一个以上程序,程序可以包括程序代码,程序代码包括计算机操作指令,在本申请实施例中,存储器11中至少存储有用于实现以下功能的程序:

在达到设定的代码扫描触发条件时,启动扫描任务;

针对每个扫描任务,在启动该扫描任务后,根据CPU架构拉取相应代码;

对拉取到的代码进行编译,获得编译结果;

调用扫描工具对编译结果进行扫描,生成扫描结果。

在一种可能的实现方式中,存储器11可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统,以及至少一个功能(比如任务创建功能、代码编译功能)所需的应用程序等;存储数据区可存储使用过程中所创建的数据,如编译数据、扫描数据等。

此外,存储器11可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件或其他易失性固态存储器件。

通信接口13可以为通信模块的接口,用于与其他设备或者系统连接。

当然,需要说明的是,图3所示的结构并不构成对本申请实施例中代码扫描设备的限定,在实际应用中代码扫描设备可以包括比图3所示的更多或更少的部件,或者组合某些部件。

相应于上面的方法实施例,本申请实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述代码扫描方法的步骤。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的技术方案及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。

相关技术
  • 一种代码质量扫描方法、装置、存储介质及电子设备
  • 一种增量代码扫描方法、装置、电子设备和存储介质
技术分类

06120112246581