CN116775090A - 自动生成补丁代码的方法和装置、电子设备和存储介质 - Google Patents
自动生成补丁代码的方法和装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN116775090A CN116775090A CN202310690121.2A CN202310690121A CN116775090A CN 116775090 A CN116775090 A CN 116775090A CN 202310690121 A CN202310690121 A CN 202310690121A CN 116775090 A CN116775090 A CN 116775090A
- Authority
- CN
- China
- Prior art keywords
- function
- code
- patch
- current
- temporary
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 68
- 230000006870 function Effects 0.000 claims abstract description 303
- 238000004590 computer program Methods 0.000 claims description 12
- 238000012795 verification Methods 0.000 claims description 9
- 238000012986 modification Methods 0.000 claims description 7
- 230000004048 modification Effects 0.000 claims description 7
- 238000004458 analytical method Methods 0.000 claims description 2
- 230000008569 process Effects 0.000 abstract description 16
- 238000012423 maintenance Methods 0.000 abstract description 8
- 238000010586 diagram Methods 0.000 description 6
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 230000008439 repair process Effects 0.000 description 2
- 239000007787 solid Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000008094 contradictory effect Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/658—Incremental updates; Differential updates
-
- 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/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/76—Adapting program code to run in a different environment; Porting
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
Abstract
本公开提供了自动生成补丁代码的方法和装置、电子设备和存储介质。所述方法包括:获取只读存储器中需要进行补丁的源代码,并备份所述源代码以生成临时代码;解析临时代码以提取出临时代码中每个函数的函数名称、函数参数和返回值;以及基于所述函数名称、函数参数和返回值将所述临时代码修改为可打补丁的临时代码。本公开提供了一种高效、安全、自动化的补丁代码生成方法,适用于各种需要固化在只读存储器的软件系统的维护和升级;全程脚本实现,大幅提高了工作效率;无需修改函数在被调用时的作用域以及属性;不依赖特定的架构和编译环境,具有较好的可移植性和通用性;打补丁的过程不会污染源代码,保证了代码的安全性和可维护性。
Description
技术领域
本公开属于嵌入式技术领域,具体涉及自动生成补丁代码的方法和装置、电子设备和存储介质。
背景技术
在嵌入式软件开发中,特别对于专用集成电路,为了降低成本,通常采用固化的形式将代码固化到只读存储器(ROM)中。一旦代码被固化到ROM中,代码内容不可再修改,但在嵌入式软件开发中,常常需要对已经发布的代码进行修改,以修复已知的漏洞或添加新的功能。由于ROM不可修改的特性,需要将修改后的代码放在其他可读写存储器中,在代码执行过程中,将原有代码替换为修改后的代码。这个过程被称为打补丁。
现有的补丁方案通常需要在可能需要更改的C语言函数中手动预留接口,用于调用随机存储器(RAM)中的补丁函数。然而,在项目开发的过程中,项目设立之初并没有准备采用ROM方式,由于需求更改等原因,可能需要将原有代码放到ROM中运行。此时,采用手动预留接口的方式在已经包含上千甚至上万个函数的工程中几乎不可能完成,即使能够手动添加,也有添加出错的可能。同时,现有的补丁方案还有连接外部可执行文件的方式,这种方式也存在局限性,不同编译器的编译信息文件不同,可能导致原有自动化提取装置在更换编译器后就不能使用。
因此,需要一种无需手动预留接口的补丁方案。
发明内容
本公开提供自动生成补丁代码的方法和装置、电子设备和存储介质,其能够解决现有补丁方案中手动预留补丁接口容易出错且不利于维护和重用的技术问题。
第一方面,本公开实施例提供一种补丁代码自动生成方法。所述方法包括:获取只读存储器中的需要进行补丁的源代码,并备份所述源代码以生成临时代码;解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值;以及基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码。
在第一方面的一种实现方式中,解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值包括:迭代检索各目录下的C语言文件;识别所述C语言文件的函数头部;提取所述函数头部中的函数名称、函数参数和返回值;以及存储所述函数名称,以生成函数名列表。
在第一方面的一种实现方式中,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码包括:基于所述返回值确定当前函数的类型;基于所述当前函数的类型向所述当前函数插入函数补丁接口,所述函数补丁接口包括所述当前函数的所述函数名称和所述函数参数;以及利用调整后的函数名称替换补丁接口指针列表中的空指针,所述补丁接口指针列表包括需要打补丁的函数的函数指针。
在第一方面的一种实现方式中,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码包括:基于所述返回值判断当前函数的类型,其中所述当前函数的类型包括只读存储器中的非补丁函数和随机存储器中的补丁函数;若当前函数是只读存储器中的非补丁函数,则基于第一预设规则判断当前函数是否需要打补丁;在需要打补丁时,向当前函数插入函数补丁接口,其中所述函数补丁接口包括当前函数的函数名称和函数参数;基于第二预设规则调整所述函数名称,将调整后的函数名称记录到补丁接口指针列表中的空指针,其中所述补丁接口指针列表包括所有需要打补丁的函数的函数指针;以及若当前函数是随机存储器中的补丁函数,则判断当前函数是否满足第一预设条件;在满足第一预设条件时,基于第三预设规则调整所述函数名称,利用调整后的函数名称替换补丁接口指针列表中的空指针。
在第一方面的一种实现方式中,基于所述返回值判断当前函数的类型包括:判断当前函数的返回值中是否具有补丁函数标记;若是,则当前函数是随机存储器中的补丁函数;否则当前函数是只读存储器中的非补丁函数。
在第一方面的一种实现方式中,基于第一预设规则判断当前函数是否需要打补丁包括:生成预置文件,其中所述预置文件包括用于存储所述函数名称的函数名列表;将当前函数的函数名称与所述函数名列表中存储的函数名称进行逐一比较;以及若当前函数的函数名称在所述函数名列表中,则当前函数需要打补丁;否则当前函数不需要打补丁。
在第一方面的一种实现方式中,所述方法还包括:编译所述可打补丁的临时代码,以生成目标代码;校验所述目标代码,以判断所述目标代码是否能够正常运行;以及在校验通过或所述目标代码能够正常运行时,将所述目标代码应用到所述源代码。
第二方面,本公开实施例提供一种自动生成补丁代码的装置。所述装置包括:获取模块,被配置为获取只读存储器中的需要进行补丁的源代码,并备份所述源代码,以生成临时代码;解析模块,被配置为解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值;以及修改模块,被配置为基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码。
在第二方面的一种实现方式中,所述装置还包括:编译模块,被配置为编译所述可打补丁的临时代码,以生成目标代码;校验模块,被配置为校验所述目标代码,以判断所述目标代码是否能够正常运行;以及发布模块,被配置为在校验通过或所述目标代码能够正常运行时,将所述目标代码应用到所述源代码。
第三方面,本公开实施例提供一种电子设备。所述电子设备包括:存储器,被配置为存储计算机程序;以及处理器,被配置为执行所述存储器存储的计算机程序,以使所述电子设备执行上述任一项所述的方法。
第四方面,本公开实施例提供一种计算机可读存储介质。所述计算机可读存储介质上存储有计算机程序,该程序被执行时实现上述任一项所述的方法。
根据本公开实施例所述的自动生成补丁代码的方法和装置、电子设备和存储介质,提供了一种高效、安全、自动化的补丁代码生成方法,适用于各种软件系统的维护和升级。此外,能够自动获取函数的函数名、函数参数及返回值,全程脚本实现,无需手动操作,大幅提高了工作效率。同时,无需修改函数在被调用时的作用域以及属性,遵循C语言规则,符合原程序设计思想,维护程序原有可靠性。另外,不依赖特定的架构和编译环境,具有较好的可移植性和通用性。此外,打补丁的过程是在临时代码所属工程中完成的,该过程不会污染源代码,同时不涉及补丁的工程师,对补丁工程不可见,保证了代码的安全性和可维护性。
附图说明
图1显示为本公开实施例提供的自动生成补丁代码的方法的流程图。
图2显示为本公开实施例提供的自动生成补丁代码的方法中函数补丁接口的工作原理图。
图3显示为本公开实施例提供的自动生成补丁代码的方法的另一流程图。
图4显示为本公开实施例提供的自动生成补丁代码的装置的结构示意图。
图5显示为本公开实施例提供的电子设备的结构示意图。
具体实施方式
以下通过特定的具体实例说明本公开的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本公开的其他优点与功效。本公开还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本公开的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
需要说明的是,以下实施例中所提供的图示仅以示意方式说明本公开的基本构想,遂图式中仅显示与本公开中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
另外,在本公开中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本公开要求的保护范围之内。
本公开以下实施例提供了自动生成补丁代码的方法和装置、电子设备和存储介质。本公开实施例所述的方法适用于C语言环境下各种固化后软件系统的维护和升级。例如,OTP主控芯片应用程序需要及时修补漏洞,修复BUG,利用本公开所述的自动生成补丁代码的方法可以快速修补漏洞,提高安全性和稳定性。此外,处理器的引导代码的维护也需要高效、准确的打补丁方法,利用本公开所述的自动生成补丁代码的方法可以提高维护效率,减少维护周期,进而降低维护成本。
下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行详细描述。
图1是示出根据本公开实施例提供的自动生成补丁代码的方法流程图。如图1所述,所述自动生成补丁代码的方法包括以下步骤S1至步骤S3。
在步骤S1,获取只读存储器中的需要进行补丁的源代码,并备份所述源代码以生成临时代码。
于一实施例中,在备份源代码时,可以将源代码直接复制到新的文件或目录中,以生成临时代码。在其他实施例中,也可以新建空白工程,通过将源代码复制到新工程中,以实现源代码的备份,或者使用版本控制工具对源代码进行版本管理和备份。
需要说明的是,本公开对备份源代码所采用的具体方式不作限定,但需要确保备份源代码后所生成的临时代码具有完整性和正确性。
在步骤S2,解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值。
于一实施例中,解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值包括:迭代检索各目录下的C语言文件;识别所述C语言文件的函数头部;提取所述函数头部中的函数名称、函数参数和返回值;以及存储所述函数名称,以生成函数名列表。
具体地,从根目录开始检索C语言文件,如果根目录具有子目录,则在子目录下迭代检索C语言文件。进一步地,根据C语言函数的特点,识别每一个C语言文件中所有函数的头部。例如,通过查找“{”可以初步确定C语言函数头的位置,接着使用正则表达式判断所述位置处的头部是否是真实的函数头。本实现方式可以避免因为if、else、while等语句对函数头的位置发生误判的情况。
当确定了一个函数的头部以后,使用正则表达式提取出该函数对应的函数名称、函数参数和返回值。其中所述函数名称用于生成函数指针列表(函数名列表),所述函数指针列表的内容由编译条件和源代码中的内容决定。对于函数参数,需要根据参数间的“,”进行拆分,以获取单个的函数参数。
本实现方式中,能够自动获取函数的函数名称、函数参数及返回值,全程脚本实现,无需手动操作,大幅提高了工作效率。
在步骤S3,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码。
于一实施例中,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码包括以下步骤S311至步骤S313。
在步骤S311,基于所述返回值确定当前函数的类型。
具体地,所述当前函数的类型包括只读存储器(ROM)中的非补丁函数和随机存储器(RAM)中的补丁函数。基于所述返回值确定当前函数的类型包括:判断当前函数的返回值中是否具有补丁函数标记;若是,则当前函数是RAM中的补丁函数;否则当前函数是ROM中的非补丁函数。
在步骤S312,基于所述当前函数的类型向所述当前函数插入函数补丁接口,所述函数补丁接口包括所述当前函数的所述函数名称和所述函数参数。
具体地,所述函数补丁接口是脚本自动向ROM函数中插入的具有相同规则的一段代码,利用ROM函数的函数名称作为变化量,以识别当前函数对应补丁接口指针列表中的哪一个指针,同时将提取的函数参数传递给该指针。
在步骤S313,利用调整后的函数名称替换补丁接口指针列表中的空指针,所述补丁接口指针列表包括需要打补丁的函数的函数指针。
于另一实施例中,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码包括以下步骤S321至步骤S323。
在步骤S321,基于所述返回值判断当前函数的类型,其中所述当前函数的类型包括只读存储器(ROM)中的非补丁函数和随机存储器(RAM)中的补丁函数。
具体地,基于所述返回值判断当前函数的类型包括:判断当前函数的返回值中是否具有补丁函数标记;若是,则当前函数是RAM中的补丁函数;否则当前函数是ROM中的非补丁函数。
在步骤S322,若当前函数是只读存储器中的非补丁函数,则基于第一预设规则判断当前函数是否需要打补丁;在需要打补丁时,向当前函数插入函数补丁接口,其中所述函数补丁接口包括当前函数的函数名称和函数参数;基于第二预设规则调整所述函数名称,将调整后的函数名称记录到补丁接口指针列表中的空指针,其中所述补丁接口指针列表包括所有需要打补丁的函数的函数指针。
具体地,基于第一预设规则判断当前函数是否需要打补丁包括:生成预置文件,其中所述预置文件包括用于存储所述函数名称的函数名列表;将当前函数的函数名称与所述函数名列表中存储的函数名称进行逐一比较;以及若当前函数的函数名称在所述函数名列表中,则当前函数需要打补丁;否则当前函数不需要打补丁。
本公开实施例中的所述预置文件可以由程序员手动生成,或者在编译过程中用symbol文件生成,也可以不生成。当不生成预置文件时,将向所有函数插入函数补丁接口。
于一实施例中,在需要打补丁时,自动向当前函数插入函数补丁接口。
具体地,所述函数补丁接口是脚本自动向ROM函数中插入的具有相同规则的一段代码,利用ROM函数的函数名称作为变化量,以识别当前函数对应补丁接口指针列表中的哪一个指针,同时将提取的函数参数传递给该指针。
图2是示出根据本公开实施例提供的函数补丁接口的工作原理图。如图2所示,当程序运行时,判断当前ROM函数对应在补丁接口指针列表中的函数指针是否为空,如果为空则执行ROM中原来的代码,如果不为空则执行指针所对应地址的代码,即补丁代码,并将脚本提取出的返回值和函数参数传递给补丁函数。
本实现方式中,无需修改函数在被调用时的作用域以及属性,遵循C语言规则,符合原程序设计思想,维护程序原有可靠性。
在步骤S323,若当前函数是随机存储器中的补丁函数,则判断当前函数是否满足第一预设条件;在满足第一预设条件时,基于第三预设规则调整所述函数名称,利用调整后的函数名称替换补丁接口指针列表中的空指针。
于一实施例中,所述第一预设条件用于筛选RAM中与工程配置相匹配的补丁函数。具体地,由于一个工程中的代码可能出现在不同的项目里,所以需要在补丁函数的某一位置设置条件选项,使得具有该条件选项的补丁函数与其所属工程建立联系。只有与工程的配置相对应的补丁函数才会被编译到目标文件,反之则就不会对补丁函数进行编译。
于一实施例中,所述第一预设条件可以是任意字符串,通过匹配该字符串确定筛选当前补丁函数是否需要替换掉补丁接口指针列表中的空指针,从而可以在不同情况下选择不同的补丁进行执行。
本公开实施例中,补丁接口指针列表中的指针在没有打补丁之前是空指针,在识别出补丁函数后,会将补丁函数名替换掉原来的空指针。
图3是示出根据本公开实施例提供的自动生成补丁代码的方法的另一流程图。如图3所述,所述自动生成补丁代码的方法还包括以下步骤S4至步骤S6。
在步骤S4,编译所述可打补丁的临时代码,以生成目标代码。
本实现方式中,不依赖特定的架构和编译环境,具有较好的可移植性和通用性。
在步骤S5,校验所述目标代码,以判断所述目标代码是否能够正常运行。
本实现方式中,通过对所述目标代码进行测试,确保了目标代码的正确性和可靠性。
在步骤S6,在校验通过或所述目标代码能够正常运行时,将所述目标代码应用到所述源代码。
本实现方式中,打补丁的过程是在临时代码所属工程中完成的,该过程不会污染源代码,同时不涉及补丁的工程师,对补丁工程不可见,保证了代码的安全性和可维护性。
本公开实施例所述的补丁代码自动生成方法的保护范围不限于本实施例列举的步骤执行顺序,凡是根据本公开的原理所做的现有技术的步骤增减、步骤替换所实现的方案都包括在本公开的保护范围内。
图4是示出根据本公开实施例提供的自动生成补丁代码的装置的结构示意图。如图4所述,所述自动生成补丁代码的装置包括获取模块41、解析模块42和修改模块43。
所述获取模块41被配置为获取只读存储器中的需要进行补丁的源代码,并备份所述源代码以生成临时代码。
所述解析模块42被配置为解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值。
所述修改模块43被配置为基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码。
需要说明的是,本公开实施例中的获取模块41、解析模块42和修改模块43的结构和原理与上述补丁代码自动生成方法中的步骤及实施例一一对应,故在此不再赘述。
于一实施例中,所述自动生成补丁代码的装置还包括编译模块44、校验模块45和发布模块46。
所述编译模块44被配置为编译所述可打补丁的临时代码,以生成目标代码。
所述校验模块45被配置为校验所述目标代码,以判断所述目标代码是否能够正常运行。
所述发布模块46被配置为在校验通过或所述目标代码能够正常运行时,将所述目标代码应用到所述源代码。
同样地,本公开实施例中的编译模块44、校验模块45和发布模块46的结构和原理与上述补丁代码自动生成方法中的步骤及实施例一一对应,故在此不再赘述。
本公开实施例所述的自动生成补丁代码的装置可以实现本公开所述的自动生成补丁代码的方法,但本公开所述的自动生成补丁代码的方法的实现装置包括但不限于本实施例列举的自动生成补丁代码的装置的结构,凡是根据本公开的原理所做的现有技术的结构变形和替换,都包括在本公开的保护范围内。
图5是示出根据本公开实施例提供的电子设备的结构示意图。如图5所述,所述电子设备包括:处理器51及存储器52。
所述存储器52被配置为存储计算机程序。
所述处理器51被配置为执行计算机程序,以使所述电子设备执行上述任一项所述的方法。
在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置或方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅是示意性的,例如,模块/单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或单元可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的模块/单元可以是或者也可以不是物理上分开的,作为模块/单元显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块/单元来实现本公开实施例的目的。例如,在本公开各个实施例中的各功能模块/单元可以集成在一个处理模块中,也可以是各个模块/单元单独物理存在,也可以两个或两个以上模块/单元集成在一个模块/单元中。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的模块及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
本公开实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被执行时实现上述任一项所述的方法。本领域普通技术人员可以理解实现上述实施例的方法中的全部或部分步骤是可以通过程序来指令处理器完成,所述的程序可以存储于计算机可读存储介质中,所述存储介质是非短暂性(non-transitory)介质,例如随机存取存储器,只读存储器,快闪存储器,硬盘,固态硬盘,磁带(magnetictape),软盘(floppydisk),光盘(opticaldisc)及其任意组合。上述存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digitalvideodisc,DVD))、或者半导体介质(例如固态硬盘(solidstatedisk,SSD))等。
本公开实施例还可以提供一种计算机程序产品,所述计算机程序产品包括一个或多个计算机指令。在计算设备上加载和执行所述计算机指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机或数据中心进行传输。
所述计算机程序产品被计算机执行时,所述计算机执行前述方法实施例所述的方法。该计算机程序产品可以为一个软件安装包,在需要使用前述方法的情况下,可以下载该计算机程序产品并在计算机上执行该计算机程序产品。
上述各个附图对应的流程或结构的描述各有侧重,某个流程或结构中没有详述的部分,可以参见其他流程或结构的相关描述。
综上所述,本公开实施例所述的自动生成补丁代码的方法和装置、电子设备和存储介质提供了一种高效、安全、自动化的补丁代码生成方案,适用于各种固化后软件系统的维护和升级。该方案能够自动获取函数的函数名、函数参数及返回值,全程脚本实现,无需手动操作,大幅提高了工作效率。该方案无需修改函数在被调用时的作用域以及属性,遵循C语言规则,符合原程序设计思想,维护程序原有可靠性。该方案不依赖特定的架构和编译环境,具有较好的可移植性和通用性。打补丁的过程是在临时代码所属工程中完成的,该过程不会污染源代码,同时不涉及补丁的工程师,对补丁工程不可见,保证了代码的安全性和可维护性。
上述实施例仅例示性说明本公开的原理及其功效,而非用于限制本公开。任何熟悉此技术的人士皆可在不违背本公开的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本公开所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本公开的权利要求所涵盖。
Claims (11)
1.一种自动生成补丁代码的方法,其特征在于,包括:
获取只读存储器中的需要进行补丁的源代码,并备份所述源代码以生成临时代码;
解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值;以及
基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码。
2.根据权利要求1所述的方法,其特征在于,解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值包括:
迭代检索各目录下的C语言文件;
识别所述C语言文件的函数头部;
提取所述函数头部中的函数名称、函数参数和返回值;以及
存储所述函数名称,以生成函数名列表。
3.根据权利要求1所述的方法,其特征在于,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码包括:
基于所述返回值确定当前函数的类型;
基于所述当前函数的类型向所述当前函数插入函数补丁接口,所述函数补丁接口包括所述当前函数的所述函数名称和所述函数参数;以及
利用调整后的函数名称替换补丁接口指针列表中的空指针,所述补丁接口指针列表包括需要打补丁的函数的函数指针。
4.根据权利要求1所述的方法,其特征在于,基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码包括:
基于所述返回值判断当前函数的类型,其中所述当前函数的类型包括只读存储器中的非补丁函数和随机存储器中的补丁函数;
若当前函数是只读存储器中的非补丁函数,则基于第一预设规则判断当前函数是否需要打补丁;在需要打补丁时,向当前函数插入函数补丁接口,其中所述函数补丁接口包括当前函数的函数名称和函数参数;基于第二预设规则调整所述函数名称,将调整后的函数名称记录到补丁接口指针列表中的空指针,其中所述补丁接口指针列表包括所有需要打补丁的函数的函数指针;以及
若当前函数是随机存储器中的补丁函数,则判断当前函数是否满足第一预设条件;在满足第一预设条件时,基于第三预设规则调整所述函数名称,利用调整后的函数名称替换补丁接口指针列表中的空指针。
5.根据权利要求4所述的方法,其特征在于,基于所述返回值判断当前函数的类型包括:
判断当前函数的返回值中是否具有补丁函数标记;
若是,则当前函数是随机存储器中的补丁函数;否则当前函数是只读存储器中的非补丁函数。
6.根据权利要求4所述的方法,其特征在于,基于第一预设规则判断当前函数是否需要打补丁包括:
生成预置文件,其中所述预置文件包括用于存储所述函数名称的函数名列表;
将当前函数的函数名称与所述函数名列表中存储的函数名称进行逐一比较;以及
若当前函数的函数名称在所述函数名列表中,则当前函数需要打补丁;否则当前函数不需要打补丁。
7.根据权利要求1所述的方法,其特征在于,还包括:
编译所述可打补丁的临时代码,以生成目标代码;
校验所述目标代码,以判断所述目标代码是否能够正常运行;以及
在校验通过或所述目标代码能够正常运行时,将所述目标代码应用到所述源代码。
8.一种自动生成补丁代码的装置,其特征在于,包括:
获取模块,被配置为获取只读存储器中的需要进行补丁的源代码,并备份所述源代码以生成临时代码;
解析模块,被配置为解析所述临时代码以提取出所述临时代码中的函数的函数名称、函数参数和返回值;以及
修改模块,被配置为基于所述函数名称、所述函数参数和所述返回值将所述临时代码修改为可打补丁的临时代码。
9.根据权利要求8所述的装置,其特征在于,还包括:
编译模块,被配置为编译所述可打补丁的临时代码,以生成目标代码;
校验模块,被配置为校验所述目标代码,以判断所述目标代码是否能够正常运行;以及
发布模块,被配置为在校验通过或所述目标代码能够正常运行时,将所述目标代码应用到所述源代码。
10.一种电子设备,其特征在于,包括:
存储器,被配置为存储计算机程序;以及
处理器,被配置为执行所述计算机程序,以使所述电子设备执行根据权利要求1至7中任一项所述的方法。
11.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被执行时实现根据权利要求1至7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310690121.2A CN116775090A (zh) | 2023-06-12 | 2023-06-12 | 自动生成补丁代码的方法和装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310690121.2A CN116775090A (zh) | 2023-06-12 | 2023-06-12 | 自动生成补丁代码的方法和装置、电子设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116775090A true CN116775090A (zh) | 2023-09-19 |
Family
ID=87992349
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310690121.2A Pending CN116775090A (zh) | 2023-06-12 | 2023-06-12 | 自动生成补丁代码的方法和装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116775090A (zh) |
-
2023
- 2023-06-12 CN CN202310690121.2A patent/CN116775090A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9940225B2 (en) | Automated error checking system for a software application and method therefor | |
EP2210183B1 (en) | Managing updates to create a virtual machine facsimile | |
US7870547B2 (en) | Method and apparatus for managing patchable software systems | |
US10579966B1 (en) | Adapting a shared project build platform to a developer plugin | |
US9027014B2 (en) | Updating firmware compatibility data | |
US9063819B2 (en) | Extensible patch management | |
CN111158674B (zh) | 组件管理方法、系统、设备及存储介质 | |
WO2016138953A1 (en) | A method for identifying a cause for a failure of a test | |
CN107992325B (zh) | 一种通过特征码检验比对文件信息的方法 | |
Rodriguez et al. | Increasing automation in the backporting of Linux drivers using Coccinelle | |
CN115658452A (zh) | 埋点校验方法、埋点校验装置、可读存储介质、电子设备 | |
CN109445800B (zh) | 一种基于分布式系统的版本自动部署方法及系统 | |
CN112947896B (zh) | 一种基于有向图的组件依赖分析方法 | |
CN111459496B (zh) | 一种防篡改的程序文件的生成方法、设备的升级方法 | |
CN111831554B (zh) | 一种代码检查方法及装置 | |
CN117215558A (zh) | 安卓的基于可视化的软件开发方法、装置、设备及介质 | |
CN116775090A (zh) | 自动生成补丁代码的方法和装置、电子设备和存储介质 | |
CN110096888B (zh) | 一种加快验证及分析smm安全隐患的方法及系统 | |
CN111897557A (zh) | 一种业务系统的更新方法、装置、设备及存储介质 | |
KR101737575B1 (ko) | 자동 생성된 sql 구문 기반의 데이터 검증 방법 및 장치 | |
Di Ruscio et al. | Towards maintainer script modernization in FOSS distributions | |
CN112860284B (zh) | 设备远程升级的sp升级包生成方法、装置及计算机设备 | |
CN118245102A (zh) | 软件项目维护方法、装置、电子设备及介质 | |
CN117349094A (zh) | 测试固态硬盘功能交互的方法、装置、设备及存储介质 | |
CN118035072A (zh) | 一种基于多版本升级的自动验收的方法及系统 |
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 |