本技术涉及计算机软件白盒测试领域,特别涉及一种在ros系统下对无人驾驶c++代码的静态扫描方法及系统。
背景技术:
1、随着人工智能、传感器和计算机视觉等技术的快速发展,无人驾驶系统逐渐成为汽车工业的研发热点和未来趋势。无人驾驶系统以其高效、安全、环保的特点,有望从根本上改变人类的出行方式,带来深远的社会和经济效益。然而,作为一个直接关系到生命安全和财产安全的关键系统,无人驾驶系统对软件可靠性和质量提出了极高的要求。
2、无人驾驶系统通常采用c++语言开发,其代码逻辑复杂、模块耦合紧密、与硬件交互频繁,开发过程中极易引入缺陷和漏洞。为了尽早发现和消除代码中的质量问题,静态代码分析成为无人驾驶系统开发中不可或缺的一环。静态代码分析通过无需运行程序,就可以对源代码进行自动化的扫描和检查,快速定位代码中的错误模式、设计缺陷、安全漏洞和性能瓶颈,从而大幅提高软件质量和开发效率。
3、然而,现有的静态代码分析工具在无人驾驶系统开发中仍然存在诸多局限,无人驾驶系统涉及复杂的并发控制、实时调度和硬件通信等特性,现有的静态分析工具难以全面理解其语义,导致分析结果中漏报和误报现象严重,无法为开发者提供可靠的质量反馈。
技术实现思路
1、针对现有技术中存在的无人驾驶系统c++代码静态分析效率低的问题,本技术提供了一种在ros系统下对无人驾驶c++代码的静态扫描方法及系统,用户将无人驾驶系统c++代码推送到git lab代码仓库时,通过git lab与jenkins job的集成,自动触发jenkinsjob执行代码扫描任务。jenkins job从git lab拉取最新代码到扫描服务器,配置无人驾驶系统的编译环境,利用cmake或catkin工具编译c++代码。在编译过程中,通过sonar qube的build wrapper插件拦截编译信息,生成代码的结构化数据。然后使用sonar scanner工具及其配置参数,扫描编译后的c++代码,并将扫描结果上传到sonar qube服务器。整个扫描过程通过jenkins job的pipeline脚本实现自动化调度,提高了分析效率。
2、技术方案,本技术的目的通过以下技术方案实现。
3、本技术的一个方面提供一种在ros系统下对无人驾驶c++代码的静态扫描方法,包括:s1,用户将无人驾驶系统的c++代码推送到git lab代码仓库;s2,基于jenkins job与git lab的集成,利用jenkins job持续集成工具对步骤s1推送的代码触发并执行代码扫描的jenkins job;s3,jenkins job从git lab代码仓库拉取步骤s1推送的最新代码到代码扫描服务器的指定目录;s4,在代码扫描服务器上通过docker容器或虚拟环境配置无人驾驶系统及无人驾驶系统各节点依赖的编译环境,用于编译步骤s3拉取到代码扫描服务器指定目录下的c++代码;s5,在代码扫描服务器的指定目录配置步骤s3拉取的c++代码的编译路径,利用ros系统下的catkin build编译工具对c++代码进行编译;s6,在代码扫描服务器上配置sonar qube的代码分析插件build wrapper的运行环境;s7,将步骤s5编译后的c++代码通过步骤s6配置的build wrapper进行处理,生成用于sonar scanner扫描分析的build-wrapper-dump.json文件;s8,配置sonar scanner的代码扫描参数,代码扫描参数包含项目名称、使用语言、build-wrapper的集成路径、sonar qube的认证token、步骤s3拉取的c++源代码在扫描服务器指定目录下的本地路径,以及sonar qube服务的url;s9,将步骤s8的sonar scanner配置通过jenkins job的pipeline脚本或jenkins jobfile进行封装,当步骤s2触发jenkins job时,调用封装的脚本,根据sonar scanner配置信息执行sonarscanner命令,对存储在步骤s3指定本地目录中的c++源代码进行静态扫描,并将扫描结果上传到sonar qube服务器。
4、本技术利用git lab的web hooks机制触发jenkins job的代码扫描job,再通过jenkins job集成sonar qube的代码扫描工具对ros项目的c++代码进行自动化静态扫描,将扫描结果反馈到sonar qube页面供开发人员审查修复,修复后的代码重新推送到gitlab再次触发自动化扫描流程,最终实现了ros项目下基于git lab、jenkins job、sonarqube的c++代码自动化静态扫描分析,提升了无人驾驶系统的代码质量及开发效率。
5、进一步的,s2,基于jenkins job与git lab的集成,利用jenkins job持续集成工具对步骤s1推送的代码触发并执行代码扫描的jenkins job,包括:s21,在jenkins job中设置与git lab互通的git lab plugin插件,用于建立jenkins job与git lab代码仓库之间的双向通信通道;s22,在jenkins job的全局配置中,配置已安装的git lab plugin插件的连接参数;连接参数包含git lab服务器的url地址和jenkins job与git lab通信的access token凭据;s23,在jenkins job中创建jenkins job,作为执行无人驾驶系统c++代码静态扫描的任务载体,jenkins job中包含代码拉取、编译、扫描和结果上传步骤;s24,在jenkins job中配置git lab代码仓库的访问凭据,授权jenkins job拉取git lab中的无人驾驶系统c++代码仓库;s25,在jenkins job的构建触发器配置中,设置git lab web hook触发器url,将jenkins job的执行与git lab代码仓库的变更事件相关联;s26,当git lab接收到步骤s1推送的代码变更事件后,git lab通过内置的web hook机制,向步骤s25配置的git lab web hook触发器url发送包含推送信息的post请求,post请求中包含了变更的代码仓库、分支和commit id的元数据;s27,git lab web hook触发器url解析post请求,提取执行代码扫描的git lab代码仓库名称和分支名称;s28,根据解析的代码仓库信息和分支信息,将代码仓库和分支信息以参数的形式传递给jenkins job,jenkins job执行无人驾驶系统c++代码的静态扫描任务。
6、进一步的,s3,jenkins job从git lab代码仓库拉取步骤s1推送的最新代码到代码扫描服务器的指定目录,包括:s31,jenkins job通过调用git lab plugin插件提供的git客户端,使用步骤s24配置的git lab代码仓库访问凭据,以clone或pull的方式从gitlab代码仓库拉取步骤s1推送的最新无人驾驶系统c++代码;s32,jenkins job在代码扫描服务器上创建一个用于存储和编译无人驾驶系统c++代码的指定目录,并将步骤s31拉取的最新代码存储到该指定目录中。
7、进一步的,s4,在代码扫描服务器上通过docker容器或虚拟环境配置无人驾驶系统及无人驾驶系统各节点依赖的编译环境,包括:s41,在代码扫描服务器上,通过docker容器镜像管理工具获取预先构建的包含无人驾驶系统及其依赖的docker基础镜像,并使用docker基础镜像通过docker file文件定义无人驾驶系统编译环境,构建ros编译环境的docker容器镜像;s42,通过docker容器镜像,创建并启动一个独立的ros编译环境容器,通过docker volume机制将步骤s32存储无人驾驶系统c++代码的指定目录挂载到ros编译环境容器的指定路径;s43,在ros编译环境容器中,根据挂载的无人驾驶系统c++代码的package.xml文件中定义的功能包依赖关系,通过无人驾驶系统的功能包管理工具配置编译和运行ros功能包和系统依赖库;s44,在代码扫描服务器上,使用与步骤s41的docker基础镜像相同操作系统的虚拟环境管理工具,创建python虚拟环境;在python虚拟环境中设置与步骤s41的docker容器镜像中相同的无人驾驶系统和依赖库;s45,通过在步骤s44创建的python虚拟环境中设置无人驾驶系统的环境变量ros_package_path,将步骤s32存储无人驾驶系统c++代码的指定目录添加到ros的包搜索路径中,以进行虚拟环境内外代码的共享访问;s46,在步骤s44创建的python虚拟环境中,根据步骤s45添加到ros包搜索路径中的无人驾驶系统c++代码的package.xml文件定义的功能包依赖关系,通过无人驾驶系统的功能包管理工具编译和运行ros功能包和系统依赖库;s47,通过持续集成工具的pipeline脚本,将步骤s41至步骤s46的配置,纳入jenkins job的执行流程中,作为无人驾驶系统及无人驾驶系统各节点依赖的编译环境。
8、进一步的,s5,在代码扫描服务器的指定目录配置步骤s3拉取的c++代码的编译路径,利用ros系统下的catkin build编译工具对c++代码进行编译,包括:s51,在步骤s42创建的ros编译环境容器或步骤s44创建的python虚拟环境中,根据步骤s32存储无人驾驶系统c++代码的指定目录结构,使用cmake工具生成代码编译的构建系统;其中,构建系统包含编译源代码目录、目标二进制目录和依赖库目录;s52,通过在步骤s51生成的cmake构建系统的cmake lists.txt文件中,设置无人驾驶系统c++代码的编译选项、编译参数和依赖库路径,设置代码编译的环境变量和规则;s53,在步骤s42创建的ros编译环境容器或步骤s44创建的python虚拟环境中,调用cmake工具,根据步骤s52配置的cmake lists.txt文件,构建make files文件和ninja文件作为编译中间文件,并生成代码编译脚本;s54,通过在步骤s42创建的ros编译环境容器或步骤s44创建的python虚拟环境中,执行步骤s53生成的代码编译脚本,利用编译工具,编译步骤s3拉取的无人驾驶系统c++代码,生成目标文件和库文件;s55,在步骤s42创建的ros编译环境容器或步骤s44创建的python虚拟环境中,使用catkin编译工具替代步骤s51至步骤s54的cmake编译方式,通过设置package.xml文件和cmake lists.txt文件,管理和编译无人驾驶系统c++代码的功能包;s56,通过持续集成工具的pipeline脚本,将步骤s51至步骤s55的cmake或catkin编译过程封装为独立的阶段,纳入jenkins job的执行流程中,与步骤s4的ros编译环境配置阶段和代码扫描阶段解耦,以实现编译任务的并行执行和调度。
9、进一步的,s6,在代码扫描服务器上配置sonar qube的代码分析插件buildwrapper的运行环境,包括:s61,在代码扫描服务器上,设置sonar qube的build wrapper;s62,在步骤s42创建的ros编译环境容器或步骤s44创建的python虚拟环境中,设置buildwrapper在代码编译和链接阶段的执行命令和参数,并将执行命令和参数集成到步骤s5的cmake或catkin编译命令中;s63,在步骤s47的jenkins job pipeline脚本中,根据当前jenkins job运行时所在的工作空间,动态生成一个与步骤s32存储无人驾驶系统c++代码的指定目录对应的build wrapper输出目录参数,并将目录参数传递给步骤s62设置的build wrapper命令,以使build wrapper在每次执行时获取当前job空间内待扫描代码的编译信息;s64,在代码扫描服务器上,创建一个与当前jenkins job对应的sonar qube项目,在项目的配置页面中设置与步骤s5的编程语言相匹配的代码检查器插件,并设置插件的质量规则和阈值参数,配置与步骤s62集成的build wrapper的参数,参数包括构建命令和构建输出目录,生成项目专用的认证令牌,以供jenkins job通过sonar scanner上传代码扫描结果时进行身份验证;s65,在步骤s47的jenkins job pipeline脚本中,将步骤s61的build wrapper安装、步骤s62的编译命令集成、步骤s63的输出目录动态生成和步骤s64的sonar qube项目创建过程,封装为一个独立的pipeline阶段,并行于步骤s4的ros编译环境配置阶段和步骤s5的代码编译阶段执行。
10、进一步的,s7,将步骤s5编译后的c++代码通过步骤s6配置的build wrapper进行处理,生成用于sonar scanner扫描分析的build-wrapper-dump.json文件,包括:
11、s71,在步骤s62设置的build wrapper执行命令中,将build-wrapper的输出结果指定为步骤s63生成的build wrapper输出目录下的build-wrapper-dump.json文件;s72,在步骤s5执行cmake或catkin编译命令时,build wrapper对编译过程进行拦截和监控,收集编译各个阶段代码文件的抽象语法树ast、符号表、依赖关系和调用关系,并以json格式写入步骤s71指定的build-wrapper-dump.json文件中。
12、进一步的,s8,配置sonar scanner的代码扫描参数,代码扫描参数包含项目名称、使用语言、build-wrapper的集成路径、sonar qube的认证token、步骤s3拉取的c++源代码在扫描服务器指定目录下的本地路径,以及sonar qube服务的url,包括:s81,在sonarscanner的配置文件sonar-project.properties中,设置扫描项目的唯一标识符sonar.project key和显示名称sonar.project name,标识符和名称基于git仓库名和jenkins job名自动生成;s82,在sonar-project.properties中,设置扫描代码的编程语言sonar.language为c++,设置源代码文件所在目录sonar.sources为步骤s32拉取代码的本地路径,设置sonar.cfamily.build-wrapper-output参数为步骤s63生成的build wrapper输出目录路径;s83,在sonar-project.properties中,设置sonar qube服务器的访问地址sonar.host.url,以及步骤s64中sonar qube项目配置页面生成的项目认证令牌sonar.login,以便sonar scanner将扫描结果上传到sonar qube服务器和项目。
13、进一步的,s9,将步骤s8的sonar scanner配置通过jenkins job的pipeline脚本或jenkins jobfile进行封装,当步骤s2触发jenkins job时,调用封装的脚本,根据sonarscanner配置信息执行sonar scanner命令,对存储在步骤s3指定本地目录中的c++源代码进行静态扫描,并将扫描结果上传到sonar qube服务器,包括:s91,在jenkins job的pipeline脚本或jenkins jobfile中,将步骤s8配置的sonar scanner代码扫描参数封装为一个独立的阶段,阶段中通过环境变量或参数化方式设置sonar scanner所需的项目名称、使用语言、步骤s62集成的build-wrapper命令路径、步骤s64生成的sonar qube项目认证令牌、步骤s32存储c++源代码的本地路径,以及sonar qube服务的访问url配置信息;s92,在pipeline脚本或jenkins jobfile的sonar scanner阶段中,通过从jenkins job的环境变量或凭据管理中获取sonar qube服务url和认证令牌,结合sonar scanner阶段的其他配置参数,使用jenkins job的sonar qube插件生成一个sonar scanner的配置文件sonar-project.properties,配置文件中包含步骤s8的所有代码扫描参数;s93,pipeline脚本或jenkins jobfile在sonar scanner阶段中,调用sonar scanner命令行工具,并将步骤s92生成的sonar-project.properties配置文件作为参数传递给sonar scanner,使其按照预设的代码扫描参数对步骤s32指定本地目录中的c++源代码执行静态扫描,扫描过程中sonar scanner识别和加载步骤s7生成的build-wrapper-dump.json文件,获取代码编译的结构化信息;s94,sonar scanner扫描完成后,将扫描结果和分析数据打包为一个扫描报告文件,报告文件中包含代码量化数据和结构化信息;sonar scanner通过http协议将扫描报告文件上传到步骤s91配置的sonar qube服务url所指向的sonar qube服务器,并使用步骤s91配置的sonar qube项目认证令牌进行身份验证和授权。
14、本技术的另一个方面还提供一种在无人驾驶系统下c++代码的静态扫描系统。
15、相比于现有技术,本技术的优点在于:
16、通过git lab与jenkins job的集成,实现了代码推送到扫描的自动化触发机制。当用户将无人驾驶系统c++代码推送到git lab仓库时,git lab自动通知jenkins job,jenkins job立即拉取最新代码并执行扫描任务。这种自动化触发方式消除了人工介入,提高了扫描的及时性和完整性,使代码分析与开发过程同步进行。
17、通过在扫描服务器上使用docker容器或虚拟环境配置ros编译环境,并利用cmake或catkin工具编译c++代码,实现了对无人驾驶系统特定编译环境的模拟和适配。这种方式克服了无人驾驶系统复杂的依赖和编译流程。
18、通过在编译过程中使用sonar qube的build wrapper插件拦截编译信息,生成代码的抽象语法树、符号表等结构化数据。将编译阶段的语义信息提取出来并用于后续扫描,弥补了传统静态分析中缺乏程序结构和执行流信息的不足,增强了对复杂代码模式的理解和分析能力,降低了漏报和误报的风险。
19、使用sonar scanner工具执行代码扫描,并借助其丰富的配置参数,灵活地适配无人驾驶系统c++代码的质量规则和阈值要求。通过可定制化的代码度量指标和检查规则,针对性地分析无人驾驶场景下的关键质量特性,如内存安全、并发正确性、异常处理等,有效地识别出系统的薄弱环节和潜在风险。
20、整个扫描过程通过jenkins job的pipeline脚本实现了自动化编排和调度。将代码拉取、编译环境配置、编译构建、build wrapper集成、sonar scanner扫描等各个步骤以流水线的方式串联,形成了一个自动化、可重复的扫描工作流。这种自动化集成方式减少了人工操作,提高了扫描的标准化程度和执行效率,缩短了反馈周期。
1.一种在ros系统下对无人驾驶c++代码的静态扫描方法,包括:
2.根据权利要求1所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
3.根据权利要求2所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
4.根据权利要求3所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
5.根据权利要求4所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
6.根据权利要求5所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
7.根据权利要求6所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
8.根据权利要求7所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
9.根据权利要求8所述的在ros系统下对无人驾驶c++代码的静态扫描方法,其特征在于:
10.一种在无人驾驶系统下c++代码的静态扫描系统,其特征在于,