一种代码扫描的方法、代码迁移的方法及相关装置与流程

文档序号:30485105发布日期:2022-06-22 00:07阅读:84来源:国知局
1.本技术实施例涉及计算机
技术领域
:,尤其涉及一种代码扫描的方法、代码迁移的方法及相关装置。
背景技术
::2.代码迁移(codemigration)是指将编程代码从一个系统移动到另一个系统。编程代码是指使用编程语言(例如c语言、c++语言、java语言、python语言等)编写的程序代码。3.目前,c/c++代码一般会包括中央处理器(centralprocessingunit,cpu)架构相关的系统宏(macro)、条件编译。在代码迁移的过程中,这些cpu架构相关的宏增加了不同cpu架构之间的代码迁移难度。4.具体地,现有标准的c/c++预处理器,在对c/c++源代码处理过程中,会对宏定义进行直接展开,对于条件编译只选择有效的代码块信息,最终输出预处理的中间文件。这种方式得到的中间文件无法提供完整的有效宏列表信息以及条件编译代码块信息,导致该中间文件不能够满足c/c++代码在不同cpu架构之间的迁移要求。技术实现要素:5.本技术实施例提供了一种代码扫描的方法、代码迁移的方法及相关装置,能够对源代码进行扫描,并准确识别出所有有效的宏和条件编译代码块,高效识别出需要进行迁移的代码段并给出准确的代码移植建议。6.第一方面,本技术实施例提供一种代码扫描的方法,包括:对源文件中的源代码进行扫描,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息,宏定义列表信息包括源代码中宏的宏定义信息,宏引用上下文信息包括在源文件中宏的引用位置,条件编译代码块信息包括所有条件分支所涉及到的宏;根据宏定义列表信息、宏引用上下文信息和条件编译代码块信息生成中间结果文件。本技术实施例能够在c/c++源代码预处理过程中,将代码迁移工具中所必需的有效信息全部进行记录并生成中间结果文件,用于指导后续代码迁移工具的源代码扫描。7.结合第一方面,在本技术实施例的一种实现方式中,对源文件中的源代码进行扫描包括:若源文件中包含头文件,则将头文件展开并扫描得到头文件对应的宏定义列表信息、宏引用上下文信息和条件编译代码块信息。在该实现方式中,该方法能够对包含的头文件进行展开,并识别有效的宏信息。8.结合第一方面,在本技术实施例的一种实现方式中,结合第一方面,在本技术实施例的一种实现方式中,对源文件中的源代码进行扫描,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息包括:若扫描到源代码的文本中包括宏,则将宏的宏定义信息记录到宏定义列表信息;若扫描到源代码的文本中的宏被引用,则将引用位置相应的行数与对应的文件标识记录到宏引用上下文信息;若扫描到源代码的文本中的条件编译代码块,则将条件编译代码块中的所有条件分支所涉及到的代码记录到条件编译代码块信息。在该实现方式中,该文件中包括的宏定义列表信息、宏引用上下文信息和条件编译代码块信息解析所有代码迁移需要的宏相关的信息,使得代码迁移工具能够根据完整的宏信息给出准确的代码移植建议。9.结合第一方面,在本技术实施例的一种实现方式中,对源文件中的源代码进行扫描之前,该方法还包括:获取预设的宏定义以及中央处理器cpu架构相关的白名单宏信息列表。在该实现方式中,代码迁移工具能够找出迁移代码后所用cpu架构相关的宏定义,因此代码迁移工具仅需将该cpu架构相关的宏进行迁移,大大减小了迁移的数据量,提高了代码迁移效率。10.第二方面,本技术实施例提供一种代码迁移的方法,包括:获取通过第一方面的代码扫描的方法得到的中间结果文件和预设中央处理器cpu架构相关的白名单宏信息列表;解析中间结果文件,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息;根据白名单宏信息列表,从宏定义列表信息中选择与预设cpu架构相关的宏定义信息组成有效宏列表信息;解析条件编译代码块信息得到各条件分支所涉及到的宏;从各条件分支所涉及到的宏中选择与有效宏列表信息匹配的宏;根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第一源代码位置;定位到第一源代码位置后迁移代码或生成第一源代码位置对应的移植建议。本技术实施例能够在c/c++源代码预处理过程中,将代码迁移工具中所必需的有效信息全部进行记录并生成中间结果文件。根据该中间结果文件中的宏定义列表信息、宏引用上下文信息和条件编译代码块信息,代码迁移工具能够解析所有代码迁移需要的宏相关的信息,使得代码迁移工具能够根据完整的宏信息给出准确的代码移植建议。11.结合第二方面,在本技术实施例的一种实现方式中,该方法还包括:扫描条件编译代码块信息对应的代码段之间的代码,按照预设规则确认是否需要进行代码迁移。在该实现方式中,对于各个宏条件代码块之间的代码,代码迁移工具采用原有的处理逻辑进行逐行扫描,需要进行确认是否需要进行代码迁移,能够不遗漏源代码中的所有宏。12.结合第二方面,在本技术实施例的一种实现方式中,按照预设规则确认是否需要进行代码迁移,包括:从代码段之间的代码中的宏中选择与有效宏列表信息匹配的宏;根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第二源代码位置后迁移代码或生成第二源代码位置对应的移植建议。在该实现方式中,代码迁移工具根据有效宏列表信息匹配相关宏,能够找出迁移代码后所用cpu架构相关的宏定义,因此代码迁移工具仅需将该cpu架构相关的宏进行迁移,大大减小了迁移的数据量,提高了代码迁移效率。13.结合第二方面,在本技术实施例的一种实现方式中,该方法还包括:根据所有源代码的扫描处理结果生成代码迁移报告。在该实现方式中,代码迁移工具可以通过中间结果文件对多个源文件源代码进行扫描,扫描完成后,生成代码迁移报告,供用户进行下载并指导完成代码迁移。14.第三方面,本技术实施例提供一种代码扫描的装置,包括:获取模块,用于获取源文件;处理模块,该处理模块用户对源文件中的源代码进行扫描,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息,宏定义列表信息包括源代码中宏的宏定义信息,宏引用上下文信息包括在源文件中宏的引用位置,条件编译代码块信息包括所有条件分支所涉及到的宏;处理模块还用于根据宏定义列表信息、宏引用上下文信息和条件编译代码块信息生成中间结果文件。本技术第三方面的装置的技术效果可参照上述第一方面的方法部分的相关效果进行理解,此处不再赘述。15.结合第三方面,在本技术实施例的一种实现方式中,处理模块用于:若源文件中包含头文件,则将头文件展开并扫描得到头文件对应的宏定义列表信息、宏引用上下文信息和条件编译代码块信息。16.结合第三方面,在本技术实施例的一种实现方式中,处理模块用于:若扫描到源代码的文本中包括宏,则将宏的宏定义信息记录到宏定义列表信息;若扫描到源代码的文本中的宏被引用,则将引用位置相应的行数与对应的文件标识记录到宏引用上下文信息;若扫描到源代码的文本中的条件编译代码块,则将条件编译代码块中的所有条件分支所涉及到的代码记录到条件编译代码块信息。17.结合第三方面,在本技术实施例的一种实现方式中,获取模块用于:获取预设的宏定义以及中央处理器cpu架构相关的白名单宏信息列表。18.第四方面,本技术实施例提供一种代码迁移的装置,包括:获取模块,用于获取通过第三方面的代码扫描的装置得到的中间结果文件和预设中央处理器cpu架构相关的白名单宏信息列表;处理模块,用于解析中间结果文件,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息;处理模块,还用于根据白名单宏信息列表,从宏定义列表信息中选择与预设cpu架构相关的宏定义信息组成有效宏列表信息;处理模块,还用于解析条件编译代码块信息得到各条件分支所涉及到的宏;处理模块,还用于从各条件分支所涉及到的宏中选择与有效宏列表信息匹配的宏;处理模块,还用于根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第一源代码位置;处理模块,还用于定位到第一源代码位置后迁移代码或生成第一源代码位置对应的移植建议。本技术第四方面的装置的技术效果可参照上述第二方面的方法部分的相关效果进行理解,此处不再赘述。19.结合第四方面,在本技术实施例的一种实现方式中,处理模块用于:扫描条件编译代码块信息对应的代码段之间的代码,按照预设规则确认是否需要进行代码迁移。20.结合第四方面,在本技术实施例的一种实现方式中,处理模块用于:从代码段之间的代码中的宏中选择与有效宏列表信息匹配的宏;根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第二源代码位置后迁移代码或生成第二源代码位置对应的移植建议。21.结合第四方面,在本技术实施例的一种实现方式中,处理模块用于:根据所有源代码的扫描处理结果生成代码迁移报告。22.第五方面,本技术实施例提供一种代码处理的设备,包括:一个或一个以上中央处理器,存储器,通信总线,通信接口;存储器为短暂存储存储器或持久存储存储器,存储器中存储有程序代码;通信接口用于收发数据;中央处理器通过通信总线与存储器通信,在代码处理的设备上执行存储器中的程序代码以执行第一方面或第二方面的方法。本技术第五方面的设备的技术效果可参照上述第一方面或第二方面的方法部分的相关效果进行理解,此处不再赘述。附图说明23.图1为本技术实施例提供的一种代码扫描的方法的示意图;24.图2为本技术实施例提供的逻辑处理单元的示意图;25.图3为本技术实施例提供的代码迁移的方法的流程图;26.图4为本技术实施例提供的代码迁移工具的示例图;27.图5为本技术实施例提供的一种代码扫描的装置的示意图;28.图6为本技术实施例提供的一种代码迁移的装置的示意图;29.图7为本技术实施例提供的一种代码处理的设备的示意图。具体实施方式30.本技术实施例提供了一种代码扫描的方法、代码迁移的方法及相关装置,能够对源代码进行扫描,并准确识别出所有有效的宏和条件编译代码块,高效识别出需要进行迁移的代码段并给出准确的代码移植建议。31.本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“对应于”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。32.在本技术实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本技术实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。33.为了下述各实施例的描述清楚简洁,首先给出相关技术的简要介绍:34.宏定义(macrodefinition):是一种批量处理的称谓。计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。35.宏替换(macrosubstitution):在使用到宏定义的位置,利用宏标识符所代替的文本信息进行替换。如果宏标识所代替的文本信息中存在其他的宏标识符,需要递归进行宏展开和替换,直至无法在进行宏展开为止。36.条件编译(conditionalcompilation):条件编译使用中编译实现方法。允许编译器在由编译期间提供的参数生成,控制产生差异的可执行程序。37.为解释上述相关技术,本技术提供一段源代码如下:38.[0039][0040]这12行源代码存储在源文件“macrotest.c”中。其中,第一行和第二行的代码可以是指宏定义信息,表示该源文件所用的宏定义,以供后续代码使用。第7行到第11行为条件编译代码段,这几行代码在执行时先检测是否满足第七行的条件,若是,则执行第八行的代码,若否,则执行第10行的代码。[0041]在c/c++代码中,会包含cpu架构相关的系统宏,条件编译,这些将增加了不同cpu架构之间代码迁移难度。人工识别代码需要进行迁移的代码段效率低,为实现高效识别出需要进行迁移的代码段并给出准确的代码移植建议,需要对源代码进行扫描,并准确识别出所有有效的宏和条件编译代码块。[0042]而现有标准的c/c++预处理器,在对c/c++源代码处理过程中,会对宏定义进行直接展开,对于条件编译只选择有效的代码块信息,最终输出预处理的中间文件。无法提供完整的有效宏列表信息以及条件编译代码块信息,若无这些完整的信息不能够满足c/c++代码在不同cpu架构之间的迁移要求。[0043]具体地,第一、现有标准的c/c++预处理器,在不同的cpu架构平台下,所识别的宏和条件编译有效代码段也不同,最终生成不同的中间结果文件,不能够保证结果的一致性。此外,例如gcc标准的编译器,需要平台支持完整的编译环境,否则平台无法支持编译器的运行。[0044]第二、在预处理过程中扫描到的宏信息,宏替换信息以及条件编译信息未进行记录,预处理结束后不能提供c/c++代码迁移所需的有效的宏列表信息和条件代码段信息,不能够准确识别出需要进行迁移的代码片段和代码迁移建议,最终将影响整个代码迁移准确性和效率。[0045]第三、当前实现的c/c++代码迁移工具基于白名单或正则匹配进行源代码扫描,无法准确识别出有效的宏定义信息(例如头文件中包含的宏,用户自定义宏等),这将影响正确的条件编译代码块的选择,最终将影响最终代码迁移的准确性。[0046]为解决上述问题,本技术实施例提供一种代码扫描的方法、代码迁移的方法及相关装置,能够对源代码进行扫描,并准确识别出所有有效的宏和条件编译代码块,高效识别出需要进行迁移的代码段并给出准确的代码移植建议。[0047]针对现有方案中预处理器没有记录关键信息的问题:现有的c/c++预处理器主要通过宏定义的文本替换,宏展开,条件编译选择有效代码块,最终生成有效的中间代码文件,而未对预处理过程中每个源文件和头文件中所扫描到的宏定义和条件编译代码块进行记录。这些信息正是不同平台之间进行c/c++代码迁移所必需的关键信息,只有准确获取到这些有效信息才能够为代码迁移工具准确提供所需要进行代码迁移的代码位置信息。本技术实施例提供的方法能够在c/c++源代码预处理过程中,将代码迁移工具中所必需的有效信息全部进行记录并生成中间结果文件,用于指导后续代码迁移工具的源代码扫描。[0048]因此,本技术实施例提供一种代码扫描的方法,由预处理器(或称代码扫描工具)执行,用于生成能够记录关键信息的中间结果文件。图1为本技术实施例提供的一种代码扫描的方法的示意图。该方法的流程包括:[0049]101、对源文件中的源代码进行扫描,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息;[0050]在本技术实施例中,宏定义列表信息包括所述源代码中宏定义信息。若预处理器扫描到源代码的文本中包括宏定义,则将该宏定义记录到宏定义列表信息中。示例性的,前述源文件“macrotest.c”中第一行代码和第二行代码为两个宏定义信息,预处理器扫描并识别到第一行代码和第二行代码为两个宏定义信息,则可以将其记录在宏定义列表信息中。[0051]作为示例,本技术实施例提供源文件“macrotest.c”的宏定义列表信息如下:[0052][0053]其中,macrodefines表示该信息为宏定义列表信息,macroname是指该宏定义的宏的名称,replacetext是该宏定义的替换内容(可以称为宏替换信息),linenum是指该宏定义在源文件的源代码中的行数(即位置),macrotrace是指该宏定义的宏追踪,portable是指该宏定义是否可移植。在实际应用中,若源代码中还可能包括更加丰富的其他信息,则预处理器可以将其一一记录下来。或者,根据实际需要,预处理器可以将指定的宏定义信息记录下来,本技术实施例对此不作限定。[0054]可以理解的是,在本技术实施例中,宏定义信息的类型可以是共用的标准的宏定义,也可以是用户自定义的宏,本技术实施例对此不做限定。[0055]在本技术实施例中,宏引用上下文信息包括在源文件中使用宏定义的位置(源代码位置)。若预处理器扫描到源代码的文本中宏定义列表信息的引用,则将该引用所在的行数与对应的文件标识记录到宏引用上下文信息。示例性的,前述源文件“macrotest.c”中第八行使用了宏定义”condition_enable”,第十行使用了宏定义”condition_disable”,则预处理器扫描识别到该情况后,可以将其记录在宏引用上下文信息。[0056]作为示例,本技术实施例提供源文件“macrotest.c”的宏引用上下文信息如下:[0057][0058]其中,macroref表示该信息为宏引用上下文信息,linenum表示该宏定义被使用的位置(行数)。其他信息与前述宏定义列表信息类似,此处不再赘述。[0059]在本技术实施例中,条件编译代码块信息包括所有条件分支所涉及到的宏定义信息。若预处理器扫描到源代码的文本中的条件编译代码块,则将条件编译代码块中的所有条件分支所涉及到的代码记录到条件编译代码块信息。示例性的,前述源文件“macrotest.c”中源代码第七行至第十一行为条件编译代码块,则预处理器可以将其中包含的所有宏定义信息进行记录。[0060]作为示例,本技术实施例提供源文件“macrotest.c”的条件编译代码块信息如下:[0061][0062][0063]其中,conditioncompilation表示该信息为条件编译代码块信息,startlinenum表示该条件编译代码块的开始行数,endlinenum表示该条件编译代码块的结束行数,conditiontype表示该条件编译代码块的类型格式,conditions表示该条件编译代码块具体的内容,conditionname表示条件名称,level表示该条件编译代码块中所使用的宏所在的级数,conditiontext表示该条件具体的内容,conditionvalue表示该条件满足的值,macrolist表示该条件编译代码块中的宏信息,macroname为宏定义的名称,macrotext为宏定义的内容。[0064]102、根据宏定义列表信息、宏引用上下文信息和条件编译代码块信息生成中间结果文件。[0065]在本技术实施例中,预处理器扫描该源文件的源代码并记录宏定义列表信息、宏引用上下文信息和条件编译代码块信息之后,可以将这些信息合并生成中间结果文件。示例性的,作为示例,本技术实施例提供源文件“macrotest.c”的中间结果文件中的内容为:[0066][0067][0068]其中,json表示该中间结果文件的文件类型为json,在实际应用中,还可以采用其他类型的文件(如yaml或用户自定义文件),本技术实施例对此不做限定。filename表示下列信息属于哪个源文件。若预处理器扫描了多个源文件,则可以将多个源文件对应记录的信息都保存在一个中间结果文件中。[0069]从上述源文件源代码的扫描过程可以看出,本技术实施例能通过对c/c++源代码进行扫描,能够记录所有宏定义列表(包括用户自定义宏)信息,其中包括宏定义值,有效作用域范围,源代码中宏引用的位置。本技术实施例通过对c/c++源代码扫描识别出所有条件编译代码块,计算各分支的值的真假以及分析并记录各分支所使用到的宏列表和各宏定义的值,最终将条件编译代码块起始位置,嵌套层次关系以及各层次所涉及到的宏列表信息,将结构化数据保存到中间文件中(例如json,yaml或用户自定文件),并作为后续代码迁移工具的输入,代码迁移工具能够准确定位到需要进行迁移和插入的代码位置。[0070]在一些实施例中,若预处理器扫描源文件的时候,识别到有些文件是头文件,则将头文件展开并扫描得到头文件对应的宏定义列表信息、宏引用上下文信息和条件编译代码块信息。具体地,预处理器可以通过文件后缀来识别该文件是普通源文件还是头文件。示例性的,文件后缀为“.h”则该文件为头文件,文件后缀为“.cpp”则该文件为源文件。预处理器识别到头文件后,可以将头文件展开并扫描得到头文件对应的宏定义列表信息、宏引用上下文信息和条件编译代码块信息。头文件展开后,预处理器对其扫描的方式与前述扫描源文件的方式类似,此处不再赘述。[0071]在一些实施例中,在步骤101之前,预处理器还可以获取预设的宏定义以及中央处理器cpu架构相关的白名单宏信息列表。其中,获取预设的宏定义是指预处理器可以从cmake或make构建工具中获取用户命令行中的宏定义。而cpu架构相关的白名单宏信息列表可以在预设的数据库中读取。[0072]基于上述图1所示的方法,本技术实施例提供了逻辑处理单元,用于进行源文件源代码的扫描,生成中间结果文件。在一些实施例中,该逻辑处理单元也可以称为预处理器、代码扫描工具,本技术实施例对此不做限定。图2为本技术实施例提供的逻辑处理单元的示意图。该逻辑处理单元首先获取c/c++源文件。若其中包含头文件,则逻辑处理单元将该头文件展开并扫描。对于不是头文件的源文件,逻辑处理单元可以直接扫描其源代码。逻辑处理单元扫描源文件和展开后头文件的方式与前述图1对应的各个实施例中扫描源文件和展开后头文件的方式类似,此处不再赘述。逻辑处理单元扫描源文件和展开后头文件之后,可以得到相关的宏定义列表信息、宏引用上下文信息、条件编译代码块信息。当逻辑处理单元完成所有源文件以及头文件的扫描之后,逻辑处理单元可以将这些信息打包形成中间结果文件。[0073]本技术实施例提供的代码扫描的方法能够对源文件中的源代码进行扫描,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息,并生成了对应的中间结果文件,该文件中包括的宏定义列表信息、宏引用上下文信息和条件编译代码块信息解析所有代码迁移需要的宏相关的信息,使得代码迁移工具能够根据完整的宏信息给出准确的代码移植建议。代码迁移工具基于中间结果文件的宏信息进行代码迁移指导,能够提高代码迁移准确率和代码迁移效率。[0074]具体地,代码迁移工具可以执行本技术实施例提供的代码迁移的方法。图3为本技术实施例提供的代码迁移的方法的流程图,该流程包括:[0075]301、获取中间结果文件和cpu架构相关的白名单宏信息列表;[0076]在本技术实施例中,中间结果文件可以是通过图1对应的各个实施例中的方法得到的中间结果文件,也可以是其他方法得到的包括宏定义列表信息、宏引用上下文信息和条件编译代码块信息的中间结果文件,本技术实施例对此不做限定。[0077]在本技术实施例中,源文件源代码中所使用的宏可能与第一类cpu相关,也可能与第二类cpu相关,此处的第一类cpu、第二类cpu可以是指x86架构的cpu、arm架构的cpu等,本技术实施例对此不做限定。当进行代码迁移时,若代码迁移工具能够找出迁移代码后所用cpu架构相关的宏定义,则代码迁移工具仅需将该cpu架构相关的宏进行迁移,大大减小了迁移的数据量,提高了代码迁移效率。具体地,若源代码由x86平台到arm平台迁移,则代码迁移工具可以获取arm架构cpu相关的白名单宏信息列表。[0078]可以理解的是,在一些实施例中,预处理器为代码迁移工具中的一个模块,则代码迁移工具可以直接从预处理器中读取得到中间结果文件。在另一些实施例中,预处理器与代码迁移工具属于不同的设备,则代码迁移工具可以通过数据传输从预处理器中获取中间结果文件。[0079]302、解析中间结果文件,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息;[0080]在本技术实施例中,代码迁移工具可以解析中间结果文件,得到宏定义列表信息、宏引用上下文信息和条件编译代码块信息。示例性的,如前述基于源文件“macrotest.c”得到的中间结果文件,该文件中用“macrodefines”表明了该标题对应的信息为宏定义列表信息,“macroref”表明了该标题对应的信息为宏引用上下文信息,“conditioncompilation”表明了该标题对应的信息为条件编译代码块信息。代码迁移工具可以读取到相关标题后解析得到相关信息。[0081]303、根据白名单宏信息列表,从宏定义列表信息中选择与预设cpu架构相关的宏定义信息组成有效宏列表信息;[0082]在本技术实施例中,代码迁移工具可以根据白名单宏信息列表,从宏定义列表信息中选择与预设cpu架构相关的宏定义信息组成有效宏列表信息。具体地,代码迁移工具可以从宏定义列表信息中选择同时在白名单宏信息列表中存在的宏定义信息来组成有效宏列表信息。示例性的,宏定义列表信息中包括宏a、宏b和宏c的宏定义信息,而白名单宏信息列表中仅包括宏b和宏c的宏定义信息,则代码迁移工具可以从宏a、宏b和宏c中选择宏b和宏c的宏定义信息来组成有效宏列表信息。[0083]304、解析条件编译代码块信息得到各条件分支所涉及到的宏;[0084]在本技术实施例中,代码迁移工具可以根据得到的条件编译代码块信息,解析条件编译代码块信息得到各条件分支所涉及到的宏。具体地,条件编译代码块信息中包括各条件分支所涉及到的宏的信息。示例性的,如前述基于源文件“macrotest.c”得到的中间结果文件,该中间结果文件中“[]macrolist”和“macroname:”condition_enable””表示该条件编译代码块的if分支引用了宏condition_enable。在实际应用中,代码迁移工具可以根据中间结果文件中的条件编译代码块信息各条件分支所涉及到的宏。[0085]305、从各条件分支所涉及到的宏中选择与有效宏列表信息匹配的宏;[0086]在本技术实施例中,代码迁移工具可以从各条件分支所涉及到的宏中选择与有效宏列表信息匹配的宏。示例性的,各条件分支所涉及到的宏中包括宏b、宏d和宏e,而有效宏列表信息中的宏定义信息为宏b和宏c对应的宏信息,则代码迁移工具可以从宏b、宏d和宏e中选择宏b为与有效宏列表信息匹配的宏。[0087]306、根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第一源代码位置;[0088]在本技术实施例中,代码迁移工具可以根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第一源代码位置。具体地,代码迁移工具可以从宏引用上下文信息中搜索到该与有效宏列表信息匹配的宏的引用位置,然后根据该位置定位到第一源代码位置。示例性的,宏b为与有效宏列表信息匹配的宏,而根据宏引用上下文信息,宏b的引用位置在源文件的第8行,则代码迁移工具可以定位到第一源代码位置为第8行。[0089]307、定位到第一源代码位置后迁移代码或生成第一源代码位置对应的移植建议。[0090]在本技术实施例中,代码迁移工具可以定位到第一源代码位置后迁移代码。示例性的,代码迁移工具在源文件的第8行找到宏b的引用后,可以将该宏b引用相关的代码插入到代码迁移报告中(并注明是宏b的引用代码),甚至可以将相关的代码进行自动迁移。[0091]在另一些实施例中,代码迁移工具可以定位到第一源代码位置后生成第一源代码位置对应的移植建议。示例性的,代码迁移工具在源文件的第8行找到宏b的引用后,可以生成移植建议为“将源文件第8行的宏b引用相关的代码进行迁移。”在实际应用中,移植建议的文本还可以有其他形式,本技术实施例对此不做限定。[0092]可以理解的是,对于条件编译代码块中未与有效宏列表信息匹配的宏,该代码迁移工具也可以给出相关建议,或插入预设的代码段。例如,宏x为条件编译代码块中未与有效宏列表信息匹配的宏,则该代码迁移工具可以宏c的相关建议为“该宏与cpu架构不相关,请做合理转换”,或者按照预设的规则进行代码转换,或者将该宏对应的代码插入到代码迁移报告中,供用户查看,本技术实施例对此不做限定。[0093]在一些实施例中,代码迁移工具还可以扫描条件编译代码块信息对应的代码段之间的代码,按照预设规则确认是否需要进行代码迁移。条件编译代码块之间的代码较为常见,因此代码迁移工具可以采用原有的处理逻辑进行逐行扫描,需要进行确认是否需要进行代码迁移。示例性的,代码迁移工具可以从代码段之间的代码中的宏中选择与有效宏列表信息匹配的宏;根据宏引用上下文信息和与有效宏列表信息匹配的宏,定位到第二源代码位置后迁移代码或生成第二源代码位置对应的移植建议。例如,代码段之间的代码中的宏为宏x、宏y,其中,宏x与有效宏列表信息匹配,则代码迁移工具可以根据宏引用上下文信息确定宏x在源文件的xx行(第二源代码位置),从而迁移代码或生成第二源代码位置对应的移植建议。[0094]在一些实施例中,代码迁移工具可以通过中间结果文件对多个源文件源代码进行扫描,扫描完成后,生成代码迁移报告,供用户进行下载并指导完成代码迁移。[0095]针对现有方案代码迁移工具没有完整记录信息的问题:现有代码迁移工具针对于平台相关的宏定义,宏替换是基于白名单或特定的正则匹配完成。是针对于文本行进行处理,缺乏具体的上下文信息作指导,有些宏定义在头文件中,通过头文件进行包含引入。此外,有些宏的可以反复define或undefine这些都需要基于预处理的上下文进行判断,某一文件某一行宏的引用是否有效,宏的值信息等,这些都需要完整的记录。本技术实施例在对c/c++源码进行预处理过程中,会收集每一个宏的有效作用域,各文件中宏的引用位置,条件编译代码块以及每个条件分支中所涉及到的所有宏信息。[0096]具体地,相较于传统的代码迁移工具,本技术实施例的代码迁移工具具有以下优点:[0097](1)传统的代码迁移工具部分宏的获取是基于宏定义的白名单,没有宏的上下文信息,无法识别出全部的宏信息,这将是导致工具误报原因之一。本技术实施例的代码迁移工具能够解析所有的宏上下文信息,代码迁移工具能够根据完整的宏信息给出准确的代码移植建议。[0098](2)传统代码迁移工具对应宏定义的识别是基于正则表达式匹配,对包含在头文件中宏定义无法进行识别,最终导致无法获取完成的宏列表信息,这也将是导致工具误报之一。本技术实施例的代码迁移工具中预处理器能够对包含的头文件进行展开,并识别有效的宏信息。[0099](3)传统代码迁移工具对条件编译的代码段是根据正则匹配逐行扫描的,不能够看到整个条件编译代码段上下文信息,不能够快速定位到需要进行代码移植的条件编译代码块。本技术实施例的代码迁移工具中预处理器生成的结构化中间文件,能够提供源文件中所有的条件编译代码块上下文信息,能够快速定位到源代码扫描的位置,提高代码扫描和迁移的效率。[0100]图4为本技术实施例提供的代码迁移工具的示例图。该代码迁移工具首先可以获取扫描源文件列表,该源文件列表中可以由源文件1、源文件2、源文件3等,代码迁移工具可以逐个源文件进行扫描,也可以多个源文件同时进行扫描,本技术实施例对此不做限定。当所有源文件扫描完毕时,代码迁移工具可以根据扫描结果生成扫描迁移报告,供用户进行下载并指导完成代码迁移。[0101]然后,代码迁移工具可以通过与图2类似的逻辑处理单元来生成中间结果文件(或称结构化格式文件),该生成过程与前述图1对应的各个方法实施例中按照该方法生成中间结果文件类似,或与前述图2对应的各个实施例中逻辑处理单元生成中间结果文件过程类似,此处不再赘述。[0102]代码迁移工具从逻辑处理单元获取到中间结果文件后,可以解析出宏定义列表信息、宏引用上下文信息和条件编译代码块信息。然后,代码迁移工具可以根据白名单宏信息列表,从宏定义列表信息中抽取指定cpu架构相关的有效宏列表信息,该过程与前述图3对应的各个实施例中的步骤303类似,此处不再赘述。[0103]代码迁移工具可以根据条件编译代码段进行源文件扫描。具体地,代码迁移工具可以通过有效宏列表信息来分析条件编译代码段中的宏是否支持期望的cpu架构。若条件编译代码段中的宏支持期望的cpu架构,则根据该情况和宏引用上下文信息定位到需要进行扫描的源代码位置,给出移植建议。若条件编译代码段中的宏不支持期望的cpu架构,则根据该情况和宏引用上下文信息进行分支代码插入(例如将该宏对应的分支代码插入到代码迁移报告)或生成移植建议。对于各个条件代码块之间的代码,代码迁移工具,采用原有的处理逻辑进行逐行扫描,需要进行确认是否需要进行代码迁移。[0104]代码迁移工具完成整个源码扫描完成后,生成代码迁移报告,供用户进行下载并指导完成代码迁移。[0105]本技术实施例提供的代码迁移工具能够通过自研的c/c++扫描工具识别出各文件上下文中所定义的有效宏信息,并格式化输出到中间结果文件中。并且,本技术实施例提供的代码迁移工具能够识别源文件中宏定义引用的上下文信息(如行号、宏替换内容、是否cpu架构相关等),并格式化输出到格式化中间文件中。后续代码迁移工具根据所记录的宏定义的上下文信息给出准确的移植建议。而且,本技术实施例提供的代码迁移工具能够识别条件编译代码块,记录条件编译的类型、起始行号,嵌套层次以及各条件分支的有效性,并格式化输出到中间文件中。代码迁移工具能够快速定位到条件编译代码块,根据记录的条件编译信息进行判断是否进行代码插入或给出移植建议。进一步地,本技术实施例提供的代码迁移工具能够进一步识别各个分支所依赖的各宏列表信息。代码迁移工具能够依据各分支所使用到的宏,判断条件编译代码段是否需要进行移植,若不需要可直接跳过扫描代码段,能够提高代码移植效率。[0106]图5为本技术实施例提供的一种代码扫描的装置的示意图。该代码扫描的装置500包括:[0107]获取模块501,用于获取源文件;[0108]处理模块502,用于执行上述图1对应的各个实施例中的步骤101和步骤102。[0109]图6为本技术实施例提供的一种代码迁移的装置的示意图。该代码迁移的装置600包括:[0110]获取模块601,用于执行上述图3对应的各个实施例中的步骤301。[0111]处理模块602,用于执行上述图3对应的各个实施例中的步骤301、步骤302、步骤303、步骤304、步骤305、步骤306和步骤307。[0112]图7为本技术实施例提供的一种代码处理的设备的示意图。该代码处理的设备700包括:一个或多个处理器701、存储器703和通信接口704,处理器701、存储器703和通信接口704可以通过通信总线702相连。所述存储器703用于存储一个或多个程序;所述一个或多个处理器701用于运行所述一个或多个程序,使得所述代码处理的设备700执行如上述各个方法实施例对应的方法。[0113]处理器701可以是一个通用中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocesser,np)、微处理器、或者可以是一个或多个用于实现本技术方案的集成电路,例如,专用集成电路(application-specificintegratedcircuit,asic),可编程逻辑器件(programmablelogicdevice,pld)或其组合。上述pld可以是复杂可编程逻辑器件(complexprogrammablelogicdevice,cpld),现场可编程逻辑门阵列(field-programmablegatearray,fpga),通用阵列逻辑(genericarraylogic,gal)或其任意组合。[0114]通信总线702用于在上述组件之间传送信息。通信总线702可以分为地址总线、数据总线、控制总线等。为便于表示,附图7中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。[0115]存储器703可以是只读存储器(read-onlymemory,rom)或可存储静态信息和指令的其它类型的静态存储设备,也可以是随机存取存储器(randomaccessmemory,ram)或者可存储信息和指令的其它类型的动态存储设备,也可以是电可擦可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、只读光盘(compactdiscread-onlymemory,cd-rom)或其它光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质或者其它磁存储设备,或者是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其它介质,但不限于此。存储器703可以是独立存在,并通过通信总线702与处理器701相连接。存储器703也可以和处理器701集成在一起。[0116]通信接口704使用任何收发器一类的装置,用于与其它设备或通信网络通信。通信接口704包括有线通信接口,还可以包括无线通信接口。其中,有线通信接口例如可以为以太网接口。以太网接口可以是光接口,电接口或其组合。无线通信接口可以为无线局域网(wirelesslocalareanetworks,wlan)接口,蜂窝网络通信接口或其组合等。[0117]在具体实现中,作为一种实施例,处理器701可以包括一个或多个cpu,如附图7中所示的cpu0和cpu1。[0118]在具体实现中,作为一种实施例,代码处理的设备700可以包括多个处理器,如附图7中所示的处理器701和处理器705。这些处理器中的每一个可以是一个单核处理器(single-cpu),也可以是一个多核处理器(multi-cpu)。这里的处理器可以指一个或多个设备、电路、和/或用于处理数据(如计算机程序指令)的处理核。[0119]在具体实现中,作为一种实施例,代码处理的设备700还可以包括输出设备和输入设备。输出设备和处理器701通信,可以以多种方式来显示信息。例如,输出设备可以是液晶显示器(liquidcrystaldisplay,lcd)、发光二级管(lightemittingdiode,led)显示设备、阴极射线管(cathoderaytube,crt)显示设备或投影仪(projector)等。输入设备和处理器701通信,可以以多种方式接收用户的输入。例如,输入设备可以是鼠标、键盘、触摸屏设备或传感设备等。[0120]在一些实施例中,存储器703用于存储执行本技术方案的程序代码710,处理器701可以执行存储器703中存储的程序代码710。也即是,代码处理的设备700可以通过处理器701以及存储器703中的程序代码710,来实现方法实施例提供的代码扫描的方法或代码迁移的方法。[0121]应理解,代码处理的设备700中的各单元和上述其他操作和/或功能,用于实现上述图1所示的方法或上述图3所示的方法,或用于实现上述图2所示的逻辑处理单元所实施的步骤和方法,或用于实现上述图2所示的代码迁移工具所实施的步骤和方法,具体细节可参见上述方法实施例,为了简洁,在此不再赘述。[0122]所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。[0123]在本技术所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。[0124]所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。[0125]另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。[0126]所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。[0127]以上实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例的技术方案的范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1