识别源代码中的固定存储器地址错误的装置、系统和方法

文档序号:6650879阅读:339来源:国知局
专利名称:识别源代码中的固定存储器地址错误的装置、系统和方法
技术领域
本发明涉及软件开发。具体地说,本发明涉及用于在建立时识别在源代码中固定存储器地址错误的装置、系统和方法。
背景技术
软件开发一般包括写入源代码(人可读代码),然后使用各种工具来将源代码转换为机器代码,所述机器代码也称为可执行代码、机器可读代码、可执行代码映像或映像文件等。在通用的软件开发中,程序员不关心当执行目标代码时诸如特定例程和数据结构之类的源代码的特定部分位于存储器中何处。通常,这些部件被动态地安装,并且可以在必要时通过操作系统来重新定位在存储器中。
但是,嵌入式系统软件程序员通常很关心在嵌入式系统的存储器中最终如何组织在源代码中的部件,特别是当可执行代码被一次安装,并且嵌入式系统的操作系统不重新定位可执行代码结构时。一般,在一个或多个程序员和/或程序员队伍之间小心地协调嵌入式系统的存储器的使用和组织。经常需要这种协调,以便在特定的存储器地址(在此称为硬编码的存储器地址)使用特定的数据结构,用于在嵌入式系统的一个或多个子系统之间的信息传递。
通常,在嵌入式系统中的存储器被多个硬件器件共享,所述多个硬件器件包括中央处理单元(CPU)、专用集成电路(ASIC)等。这些硬件器件可以被硬连线以分支到在所述共享存储器中的特定位置(称为进入点),以开始执行可执行代码——也称为微码。因此,当微码在源代码文件中产生时,在源代码中的硬编码的存储器地址用于将微码置于硬件器件预期找到它的位置。
某些嵌入式系统可以包括更适合于在嵌入式系统中的操作的特定需要的不同类型的存储器。例如,嵌入式系统可以包括只读存储器(ROM)、随机存取存储器(RAM)、高速缓冲存储器、插板高速存储器和外部存储器等。所述不同类型的存储器经常被逻辑组合到单个内存块中,并且每种类型的存储器具有特定的起始和结束地址。因此,程序员可以使用所述硬编码的开始和结束地址来以程序管理在存储器硬件中何处存储特定的数据结构。硬编码的存储器地址经常用于优化嵌入式系统的性能和可靠性。
一般使用十六进制来指定硬编码的存储器地址。一般,使用存储空间分配表或存储器布局来协调和组织在嵌入式系统中的存储器资源的使用。所述存储空间分配表指定在何处存储可执行代码以及数据结构,包括初始化的或未初始化两者。
不幸的是,广泛使用的传统编程语言和工具不能提供用于指定硬编码的地址的公共位置。而且,即使当使用存储空间分配表时,也难于跟踪硬编码的存储器结构的大小和位置,因为程序员可能低估具有可变大小的数据结构所需要的大小。由于因为不同的软件开发时间表而导致的在程序员之间缺少联系和程序员与所有协作来产生所述嵌入式系统的不同公司缺少联系,导致管理硬编码的存储器地址会进一步复杂。
这些挑战经常导致在存储器使用中的错误。某些数据结构因为指定了错误的开始或结束地址而可能违反其他的数据结构。这种类型存储器错误在此被称为存储器边界错误或重叠错误。可以向其他定制限定的存储器区域中填充其组合大小大于所述定制限定的存储器区域的数据结构。这种类型存储器错误在此被称为存储器容量错误或溢出错误。
不幸的是,传统的编程工具不允许检测这些错误,直到源代码被完全编译和内置在可执行代码中并且执行了可执行代码。一般,嵌入式系统程序员被迫使等待这些错误在测试环境中被发现或更差的是使用环境中被发现。
因为传统的嵌入式系统编程工具要求在建立处理中使用独立的定义文件以为编译程序——在链接命令文件中是为链接程序——指定在源代码中的硬编码的存储器地址,因此使得更难于管理硬编码的存储器地址。图1示出了需要独立的定义文件来定义对于数据结构和存储器区域的硬编码的存储器地址的传统建立处理。
系统100包括编译程序102和链接程序104。作为选择,汇编程序可以汇编由编译程序102产生的汇编代码,并且向链接程序104提供所述汇编的代码。或者,汇编程序可以与编译程序102集成在一起。
编译程序102在一个或多个源代码文件106中读取和产生目标代码。一般,源代码106引用具有相关联的硬编码的存储器地址的可变常数。程序员直接在源代码中定义硬编码的存储器地址。在源代码的逻辑中使用所述硬编码的存储器地址或与其相关联的常数。
链接程序104将多个目标代码文件链接到单个可执行图像或文件中。链接程序104被配置来产生与目标嵌入式系统平台的存储器架构兼容的图像文件108。为了限定特定数据结构的定制存储器区域并且利用专用的存储器硬件,链接程序读取链接命令文件或脚本110。所述链接命令文件110包括硬编码的存储器地址和命令,它们具有链接程序104可理解的语法。
不幸的是,在源代码106和链接命令文件110中指定了相同的存储器地址。因此,对于一个文件106的改变必须在其他文件110中被复制,反之亦然。程序员可能不能在两处进行所述改变。类似地,在大的项目中,在一个文件中的改变的连锁反应不能通过其他一个或多个文件被追踪。
图1也示出了错误的硬编码的存储器地址可能引起的各种错误。例如,处理器112、114可以分支到进入点116、118,但是对于处理器112、114的微码不能定位于预期的进入点116、118。诸如数据结构B2之类的数据结构在数据结构B1的结束地址之前开始(边界错误)。固定大小的另一个数据结构120可能试图包括超过数据结构120的容量的数据结构DS1、DS2和DS3。当在所述数据结构内部的字段组合来占用比程序员预期的更多的空间时,这会发生。
从前面的讨论,明显的是需要用于在建立时识别在源代码中的固定存储器地址错误的装置、系统和方法。这样的装置、系统和方法将使得可以合并硬编码的存储器地址定义。另外,所述装置、系统和方法在建立时查看硬编码的存储器地址定义,以便在执行可执行代码之前可检测硬编码的存储器地址。

发明内容
本发明针对现有技术的当前状态、具体地说针对还没有满足的在本领域中的问题和需要而作出,以在建立时识别在源代码中的固定存储器地址错误。
按照本发明的一种装置包括置换模块、判定模块、产生模块和评估模块。所述置换模块用固定的存储器地址值置换硬编码的存储器地址符号。按照在固定存储器地址值和硬编码的存储器地址符号之间的映射而置换所述固定的存储器地址值。在用于编译源代码和链接从源代码编译的目标代码的公共资源中定义所述映射。
所述判定模块通过引用目标代码而确定与硬编码的存储器地址符号相关联的变量的大小和位置信息。从源代码来编译所述目标代码。所述产生模块根据由所述判定模块提供的所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件。所述评估模块评估所述条件和响应于违反所述条件之一而发出表示错误的信号。最好是,所述评估模块包括传统的建立处理部件,诸如传统源代码预处理器。在一个实施例中,传统的预处理器是C编程语言预处理器。当然,所述配置的条件由源代码预处理器评估。最好是,所述条件包括上下文有关的错误消息,它识别触发了所述条件的变量和包括至少重叠错误和溢出错误的错误类型。
在某些实施例中,所述装置也可以包括存储器区域判定模块、区域条件产生模块和区域条件评估模块。所述存储器区域判定模块可以被配置来确定由硬编码的存储器地址符号至少部分地定义的定制存储器区域的大小和位置信息。所述区域条件产生模块被配置来根据用于指定每个定制存储器区域的变量的累积大小产生一个或多个验证存储器区域满足存储器区域容量限制的区域条件。所述区域条件评估模块被配置来评估所述条件和响应于违反所述条件之一而发出表示错误的信号。
在所述公共资源中定义的定制存储器区域可以被源代码和用于链接目标代码的链接命令文件引用。所述区域条件产生模块包括容量计算模块,它被配置来根据定制存储器区域的大小而确定每个区域的区域容量。所述区域条件产生模块也包括汇总模块,它被配置来汇总被分配到定制存储器区域的每个变量的大小信息,以及条件产生器,它被配置来产生将每个定制存储器区域的汇总大小信息和区域容量相比较的条件,并产生与上下文相关的错误消息。
在一个实施例中,所述公共资源包括通过开始地址和结束地址而定义定制存储器区域的值。另外,通过开始地址和偏移或长度来定义定制存储器区域。所述定制存储器区域可以被在源代码和在链接命令文件中都被引用的存储器区域符号表示,所述链接命令文件被提供到用于链接目标代码的链接程序。所述公共资源可以包括公共定义文件。在某些实施例中,所述公共定义文件可以被包括在源代码文件和链接命令文件中。
在另一个实施例中,一种装置包括源代码预处理器、固定地址验证模块和后处理器。所述源代码预处理器被配置来用一个值置换位置保持符。在值和位置保持符之间的映射被定义在公共定义文件中,所述公共定义文件被源代码的编译程序和链接程序引用,所述链接程序被配置来链接从源代码编译的目标代码。所述固定地址验证模块被配置来搜索至少一个与位置保持符相关联的变量的大小和位置信息,并且根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件。所述后处理器被配置来通过源代码预处理器发送所述条件以用于评估,以便违反所述条件之一时以信号来指示错误。
按照本发明的一种系统可以包括一组源代码,它包括一个或多个公共头文件,所述头文件包括映射到固定存储器地址值的硬编码的存储器地址符号。所述硬编码的存储器地址符号可以由在源代码中和在链接命令文件中的变量使用。所述系统的预处理器可以被配置来预处理适当配置的链接命令文件,所述适当配置的链接命令文件引用所述公共头文件,以便在所述公共头文件中的硬编码的存储器地址符号被置换为固定存储器地址值。所述预处理器可以将结果存储在中间文件中。
所述系统的固定地址验证模块可以读取所述中间文件,为与硬编码的存储器地址符号相关联的至少一个变量搜索从源代码编译的目标文件中的大小和位置信息,根据所述大小和位置信息产生验证满足存储器边界限制的变量的一个或多个条件,并且在修改的链接命令文件中存储所述一个或多个条件。可以随后使用预处理器来重新处理所述修改的链接命令文件,所述预处理器评估所述条件以便违反所述条件之一时以信号指示错误。所述系统换可以包括编译程序,它被配置来将源代码编译为汇编的代码;以及汇编程序,它被配置来将所述汇编代码汇编为目标代码。在所述系统中的链接程序可以通过按照被修改的链接命令文件而链接库数据和目标代码来产生图像文件。
本发明提供的信号承载介质包括机器可读指令,所述机器可读指令被配置来执行用于在建立时识别在源代码中的固定存储器地址错误的操作。在一个实施例中,所述操作包括用固定存储器地址值置换硬编码的存储器地址符号。另一个操作通过引用目的代码而确定与固定存储器地址符号相关联的变量的大小和位置信息。一个操作根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件。最后,一个操作评估所述条件,并且响应于违反所述条件之一而以信号表示错误。
本发明可以被实施在实用程序中,诸如固定存储器地址确认实用程序。用户可以定义单个定义文件,它包括映射到固定存储器地址值的硬编码的存储器地址符号。在源代码和链接命令文件中都引用所述硬编码的存储器地址符号。用户可以随后调用所述固定存储器地址确认实用程序,所述固定存储器地址确认实用程序将固定存储器地址值置换为如在所述定义文件中所示的链接命令文件中的硬编码的存储器地址符号,并且产生条件,所述条件被配置来验证与固定存储器地址值相关联的变量满足存储器边界限制,所述条件可以被源代码建立处理的软件模块读取。用户然后调用所述源代码建立处理,所述源代码建立处理评估所述条件,并且响应于所述条件之一的违反而向用户通知错误。
本发明也包括被配置为方法和装置的实施例,所述方法和装置包括与上面涉及所述装置、系统、方法和实用程序描述的部件和步骤大致相同的功能。通过下面的说明和所附的权利要求,本发明的特征和优点可以变得更明显,或者可以通过如下所述的本发明的实践来学习本发明的特征和优点。


为了易于了解本发明的优点,将通过参照在附图中示出的特定实施例而提供上面简述的本发明的更具体的说明。应了解这些附图仅仅描述本发明的典型实施例、因此不应当被当作其范围的限定的情况下,将通过使用附图来更具体和详细地说明和解释本发明。
图1示出了传统的编码图像的软件建立处理的框图;图2示出了按照本发明的一个实施例的建立处理的逻辑框图,用于在建立时识别在源代码中的固定存储器地址错误;图3示出了按照本发明的适合于在建立时识别在源代码中的固定存储器地址错误的一个示例性系统的示意框图;图4示出了适合于实施本发明的特定实施例的一个示例性装置的示意框图;图5示出了适合于实施本发明的特定实施例的另一个示例性装置的示意框图;图6示出了在建立时识别在源代码中的固定存储器地址错误的方法的示意流程图;以及图7示出了用于使用固定地址确定实用程序来在建立时识别在源代码中的固定存储器地址错误的方法的示意流程图。
具体实施例方式
应了解的是,在此在附图中一般说明和示出的本发明的部件可以以多种不同的配置而被安置和设计。因此,在在下面对附图中给出的本发明的装置、系统和方法的实施例的更详细的说明不意欲限定所给出的本发明的范围,而是仅仅示例性本发明的选择的实施例。
通过参照附图将更好地了解本发明的示出实施例,其中,在全部附图中,相同的附图标号表示相同的元件。下面的说明意欲仅仅是举例而言,并且仅仅说明与在此所提出的本发明一致的器件、系统和处理的特定所选择实施例。
图2示出了改进的建立处理200的逻辑框图,包括可以被组织来便于硬编码的存储器地址定义202的管理的部件和模块。具体地说,通常被存储在文本文件中的多个硬编码的存储器地址定义202与源代码文件212和一个或多个链接命令文件分别通过预处理器204。预处理器204分别修改源代码文件212和链接命令文件214以包括所述硬编码的存储器地址定义202。被修改的源代码文件212和链接命令文件214然后分别被用作传统编译程序102和传统链接程序104的输入。
不像传统的建立处理100那样,按照本发明的一个实施例的建立处理200将所有的硬编码的存储器地址定义202合并到公共资源216(在图2中的资源名称是“Def.h”)。在某些实施例中,所述公共资源216包括公共定义文件。通过合并所述定义202,大大地降低了在定义202中的细微错误的可能。而且,在单个位置管理的定义202的改变,这也降低了错误的可能。
所述公共资源216可以包括一个或多个文件。在一个实施例中,公共资源216包括一个或多个具有与编程语言——诸如C或C++——兼容的h.extention的文件。最好是,公共资源216被格式化以与源代码编程语言或特定链接命令文件214的格式可以兼容。公共资源216也包括使得在预处理器204分别利用源代码212和链接命令文件214来处理定义202之后同一定义202用于源代码212和链接命令文件214中的指令。
例如,定义202可以包括一系列分配指令218,它将符号220——也称为硬编码的存储器地址符号220——与通常具有十六进制地址形式的固定存储器地址值222相关联。这些分配指令218构成在固定存储器地址值222和硬编码的存储器地址符号220之间的映射。分配指令与预处理器204兼容。最好是使用硬编码的存储器地址符号220来取代所有的固定存储器地址值222来编写源代码212和链接命令文件214。或者,源代码212和链接命令文件214可以被修改以使用仅仅硬编码的存储器地址符号220。硬编码的存储器地址符号220通过下述方式来便利编程通过提供直观的符号以用于源代码而不是代表在源代码212中的常数的多个模糊的固定存储器地址值222。
在某些实施例中,预处理器204是传统的预处理器204,通常用于联结源代码212和编译程序102以产生汇编代码。预处理器204将一个或多个文本文件作为输入,并且处理在所述文本文件中发现的、对于预处理器204专用的处理指令。预处理器204指令可以被嵌入式源代码212中或分组到诸如h.file(即“def.h”,)之类的公共资源216中。公共资源216可以使用预处理器202指令(或命令)——诸如“#include<file name>”——而被包括在源代码212中。所述“#include”指令将所引用的文件file name(文件名称)合并到源代码文件212中。
通常,预处理器204作为宏置换实用程序操作。所述宏(macros)由分配指令218定义,并且定义为要由一个值置换的源代码212中的符号。换句话说,预处理器204用值置换源代码212中的符号。
所述值可以是包括十六进制地址、函数或目标定义等的任何文本。在本发明中,所述符号构成硬编码的存储器地址符号220,并且所述值构成固定存储器地址值222。以这种方式,被定义为在整个源代码212中被引用的常数的变量可以在单个公共位置被定义和改变,这减少了错误。
最好是,硬编码的存储器地址符号220是直观的,并且表示用于识别数据结构和存储器区域的进入点、开始点以及数据结构和/或存储器区域的大小。同样的硬编码的存储器地址符号220最好也用于链接命令文件214中。链接命令文件214也可以包括预处理器204指令,诸如“#include<file name>”。如上所述,“#include”指令将公共资源216合并到链接命令文件214中。
作为示例性示例,公共资源216定义数据结构B1,它具有与硬编码的存储器地址符号220“_B1start”相关联的在固定存储器地址值222的开始地址和与硬编码的存储器地址符号220“_B1end”相关联的在固定存储器地址值222的结束地址。定制存储器区域ROM源于与硬编码的存储器地址地址220“ROMO”相关联的固定存储器地址值222,并且具有与硬编码的存储器地址符号220“ROML”相关联的固定存储器地址值222的长度。因此,可以通过开始地址和长度或通过开始地址和结束地址来定义所述定制存储器区域。因此,固定存储器地址值222可以表示以十六进制格式表达的存储器的特定地址或特定大小。
也应当注意,硬编码的存储器地址符号220“ROMO”和“ROML”用于在链接命令文件214中的指令中以定义定制存储器区域。将链接命令文件214和公共资源216通过预处理器204用适当的固定存储器地址值222置换相关联的硬编码的存储器地址符号220。具有所述适当的固定存储器地址值222的被修改的链接命令文件然后被传送到链接程序104以建立代码映像108。在将在ROMO中的前8个字节复制到目的地的源代码的复制操作中引用同一硬编码的存储器地址符号220“ROMO”。将源代码212和公共资源216通过预处理器204用所述适当的固定存储器地址值222置换相关联的硬编码的存储器地址符号220“ROMO”。同样应注意的是,因为在公共资源216中定义示例性性数据结构B2,因此开发人员可以容易地保证数据结构B2在B1结束后开始。
因此,通过使用在源代码212和链接命令文件214中的所述相同的硬编码的存储器地址符号220,预处理器204可以代入在公共资源216中定义的固定存储器地址值222以产生具有一致的固定存储器地址值222的源代码212和链接命令文件214。因为在单个定义文件中定义了将硬编码的存储器地址符号220向固定存储器地址值222的映射,因此错误被减少。
现在参见图3,示出了用于在建立时识别在源代码中的固定存储器地址错误的系统300。系统300包括源代码302、预处理器304、固定地址验证模块306、编译程序308、汇编程序310和链接程序312。最好是,编译程序308、汇编程序310和链接程序312对应于并且执行与结合图1示出和/或讨论的传统编译程序102、汇编程序(在图1中未示出)和链接程序104基本相同的功能。
源代码302最好包括一个或多个公共头文件314。头文件314包括结合图2讨论的硬编码的存储器地址定义202。源代码文件302而不是头文件314最好严格引用硬编码的存储器地址符号220而不是实际的存储器地址值。可以直接使用指针来引用硬编码的存储器地址符号220。或者,在源代码302中的其他变量、对象和数据结构的定义中包括硬编码的存储器地址符号220。类似地,链接命令文件315通过使用变量、对象和数据结构而直接或间接地引用相同的硬编码的存储器地址符号220。
预处理器304被配置来预处理被配置来引用头文件314的链接命令文件315。预处理器304执行与结合图2所述的预处理器204基本上相同的功能。在一个实施例中,预处理器304输出中间文件316。中间文件316包括链接命令文件315,并且将硬编码的存储器地址符号220置换为固定存储器地址值222。或者,预处理器304可以流输出(stream output)到固定地址验证模块306。
最好是,固定地址验证模块306在现在包括来自头文件314的定义的中间文件316中读取。固定地址验证模块306引用目标代码318以识别与硬编码的存储器地址符号220相关联的变量。或者,固定地址验证模块306可以语法分析头文件314以识别与硬编码的存储器地址符号220相关联的变量。一旦识别了变量,则固定地址验证模块306对于也称为目标文件318的预先编译和汇编的目标代码318搜索所述变量的大小和位置信息。
目标代码通常包括三种数据Block Started By Symbol(bss)(符号开始的块)段、文本段和数据段。bss段包括需要保留存储器量的符号,但是所述存储器不被初始化为特定值。文本段包括构成软件程序的机器指令。数据段保存被初始化为特定值的变量。最好是,固定地址验证模块306引用由编译程序产生的符号表以识别要搜索的变量。在某些实施例中,固定地址验证模块306可以确定在符号表中发现的符号、变量的子集的大小和位置信息。
在一个实施例中,固定地址验证模块306确定在链接命令文件315中的、与硬编码的存储器地址符号220相关联的变量的大小和位置。或者,固定地址验证模块306可以确定所有被定义的变量的大小和位置信息。
固定地址验证模块306使用所述变量大小和位置信息以产生一个或多个条件319,以验证所述变量满足存储器边界限制。存储器边界限制是没有变量开始、停止或延伸到被分配到其他变量的存储器地址的要求。
根据如何对于系统定义存储器部分,固定地址验证模块306可以产生简单或复杂的条件319。在一个实施例中,可以组织所述变量,以便在存储器中一个变量顺序地跟随最后的变量。因此,对于每个变量,固定地址验证模块306可以产生简单条件319,它保证这个变量不是在存储器中比最后变量结束的地址更早的地址开始。
条件319验证一个变量的边界不被另一个变量的边界妨碍。例如,可以由开始地址0x2000和结束地址0x4000地址来定义由开发人员A编码的数据结构DS1。但是,工作在同一系统上但是不知道开发人员A的数据结构DS1的开发人员B可以定义妨碍了DS1的边界的数据结构DS2。DS2可以具有结束地址0x8000和开始地址0x3000。传统上,这样的错误不被检测到,直到所述软件被执行,并且DS1或DS2彼此妨碍或者开发人员A向开发人员B交谈。
最好是,条件319被存储为在建立处理200中由一模块可以执行的指令。在一个实施例中,所述指令包括源代码预处理器304的可执行指令。例如,所述指令可以包括“#error text-expression”语句。所述text-expression(文本表达式)可以包括直观的、上下文相关的消息和调试信息。所述调试信息可以识别在条件319中涉及的变量以及所识别的错误类型。所述错误类型可以是重叠错误或溢出错误之一。
在一个实施例中,固定地址验证模块306在被修改的链接命令文件320中存储所述条件319。或者,条件319可以被写入到在原始LDF315中包括的诸如头文件之类的独立文件中,以产生被修改的链接命令文件320。所述被修改的链接命令文件320可以包括链接命令文件315的所有原始指令以及由预处理器304进行的添加的置换,以产生中间文件316和条件319的增加。固定地址验证模块306可以将被修改的链接命令文件320传送到预处理器304以评估条件319。
预处理器304评估条件319。如果条件319被违反,则预处理器304以信号表示错误322。预处理器304可以使用预处理器304的用户界面(未示出)来显示直观的、上下文相关的消息和调试信息。或者,预处理器304可以向错误文件写入所述消息和调试信息。在某些实施例中,则预处理器304一旦遇到错误322则可选择地停止处理。或者,预处理器304继续处理,直到处理了整个被修改的链接命令文件320。
如果预处理器304评估条件319并且未发现错误322,则系统300可以通过使用被修改的链接命令文件320、目标代码318和库文件326作为输入而调用链接程序312来继续所述建立处理200。在某些实施例中,链接程序312可以包括用于确认指定它们位于定制存储器区域的变量实际上适合于特定的定制存储器区域内的逻辑。链接程序312产生基本上没有硬编码的存储器地址错误的映像文件324。
最好是,系统300也包括预建立器328。所述预建立器328调用编译程序308和汇编程序310以从源代码302产生目标代码318。通常,预建立器328也使用头文件314。最好是,编译程序308和汇编程序310被调用,而不调用链接程序312。如上所述,固定地址验证模块306引用目标代码318。因此,在启动建立中间文件316的预处理器304之前,优选地调用预建立器328。最好是,如果已经改变了源代码302,则由用户/程序员调用预建立器328。
图4示出了用于在建立时识别在源代码中的固定存储器地址错误的装置400。图4也示出了按照本发明的建立处理200(见图2)的数据流。装置400包括源代码预处理器402、固定地址验证模块404和后处理器406。
在一个实施例中,源代码预处理器402包括与结合图3所述的预处理器304基本上相同的功能。源代码预处理器402将值置换为位置保持符(placeholder)。所述值通常包括固定存储器地址值。所述值置换为位置保持符可以包括硬编码的存储器地址符号。当然,预处理器304也可以进行其他的置换。
源代码302和链接命令文件(LDF)315包括位置保持符。在某些实施例中的也被称为头文件314和公共资源314的公共定义文件(CDF)314包括向位置保持符的值的映射。固定地址验证模块404使用与结合图3所述的固定地址验证模块306基本上相同的方式处理中间文件316和引用目标代码318(见图3)以产生被修改的LDF408。
所述装置400也可以包括存储器区域确定模块410和区域条件产生模块412。存储器区域确定模块410和区域条件产生模块412合作来管理具有固定存储器地址值的定制定义存储器区域。这些定制存储器区域可以具有固定存储器地址值,以便开发人员可以使用具有诸如速度和高速缓存等的特定特性的存储器的多个部分。
在诸如嵌入式系统之类的某些软件系统中,可能期望指定用于特定目的的存储器的某些部分。例如,在特定的嵌入式系统中,多个控制模块(也称为主部件)应当访问同一数据结构。所述数据结构可以包括例如包括关于整个嵌入式系统的状态的不同属性的状态结构。控制模块的示例包括中央处理单元(CPU)、服务处理器和多个外设部件互连(PCI)主部件等。
通常,为了便利在可以负责编程不同控制模块的各种供应者之间的开发努力,数据结构被定位在存储器中固定的存储器地址。而且,性能要求可以要求数据结构被定位在诸如高速缓冲存储器之类的特定类型的存储器中。所述特定类型的存储器被定义在LDF315中,LDF315作为也被称为定制存储器区域的存储器区域。在一个实施例中,LDF315包括链接程序命令,诸如“Memory{Expression(s)}”和“Sections{Expression(s)}”,它们分别定义定制存储器区域和指定如何组织存储器区域。可以使用存储器区域符号或变量来在LDF315和源代码302中引用所述定制存储器区域。
最好是,在CDF314中定义所述定制存储器区域的大小和位置信息。在一个实施例中,CDF314提供定制存储器区域的开始地址和结束地址的硬编码值。或者,CDF314可以包括硬编码值,用于定义开始地址和长度或偏移以定义定制存储器区域。
另外,开发人员可能需要分配或指定在定制存储器区域内定位特定变量。在源代码302中的编译程序指令(即“#pragma expression”)指定要被定位在定制存储器区域内的变量。在定制存储器区域内指定的变量的大小信息被定义在预先编译的源代码302中。最好是,定义和例示这些变量的源代码被合并到在源代码预处理器402处理LDF315之前被预先编译的单个源代码文件302中。
存储器区域确定模块410引用LDF315以确定每个存储器区域——通常是标准和定制存储器区域——的大小和位置信息。具体地说,对于由硬编码的存储器地址符号220定义的存储器区域确定大小和位置信息。存储器区域确定模块410向区域条件产生模块412提供所述大小和位置信息。
区域条件产生模块412产生一个或多个区域条件,用于验证特定存储器区域满足存储器区域容量限制。具体地说,区域条件产生模块412确定要被定位在定制存储器区域内的变量的累积大小。特定区域条件也可以验证固定大小的非定制存储器区域由于变量分配而不溢出。
存储器区域容量限制是一个要求位于存储器区域内的数据结构没有超过所述存储器区域的整体大小或容量的组合大小。通常,程序员定义分配到各种大小的数据结构的多个变量位于定制存储器区域内。但是,可能很难协调在单个存储器区域内的数据结构的大小和数量,特别是在不同的嵌入式系统开发人员位置的程序员之间。传统上,这导致在定制存储器区域中被分配到定制存储器区域的数据结构的数量和大小超过所述定制存储器区域的大小。在此,这被称为存储器溢出错误。通常不显示存储器溢出错误,直到可执行的代码被测试和/或部署,并且会难于诊断。
装置400避免了这个问题,因为所述区域条件使用与如上所述的条件319类似的方式被插入或链接到LDF315以形成被修改的LDF320。区域条件被源代码预处理器402配置来用于评估。
在一个实施例中,后处理器406再次通过源代码预处理器402发送条件319。通常,后处理器406调用预处理器402,并且使用被修改的LDF320来作为输入。如上所述,如果违反了条件319之一,则预处理器402可以以信号来表示错误414。通常,在装置400操作中的错误报告处理使用与结合图3所述的错误报告322基本上相同的方式。
在某些实施例中,当被修改的LDF320包括条件319和区域条件时,如果违反条件319或区域条件之一,则以信号表示错误414。有益的是,这使得程序员可以在建立处理200期间而不是在测试或使用期间识别存储器重叠错误或存储器溢出错误。在建立处理200期间识别的错误可以更容易地被调试和解决,特别是在其中错误消息是上下文相关的实施例中。
或者,存储器区域确定模块410和区域条件产生模块412被配置来动态地查看存储器溢出错误的源代码。例如,存储器区域确定模块410可以计算定制存储器区域的最大大小。所述存储器区域确定模块410和/或区域条件产生模块412可以随后扫描在目标代码318中的符号表以确定分配定制存储器区域的变量的运行汇总大小。如果所述运行汇总超过最大大小,则区域条件产生模块412或存储器区域确定模块410可以以信号表示存储器溢出错误。当然,区域条件产生模块412和存储器区域确定模块410可以在符号表的单个扫描期间管理多个定制存储器区域。
图5示出了用于在建立时识别在源代码中的固定存储器地址错误的装置500的另一个实施例。在结合图3和4分别所述的系统300和装置400中,文件302、314、315、316和320被配置来以便利实现本发明的新方式利用传统工具,诸如源代码预处理器304、编译程序308和链接程序312。装置500包括在系统300和装置400中所述的逻辑模块的另外的配制。
装置500包括置换模块502、判定模块504、产生模块506和评估模块508。置换模块502以与预处理器204基本相同的方式来用固定存储器地址值222(见图2)置换相关联的硬编码的存储器地址符号220。但是,置换模块502可以包括一与传统的源代码预处理器204分离和不同的模块。
判定模块504以与固定地址验证模块306(见图3)基本上相同的方式来确定与硬编码的存储器地址符号相关联的变量的大小和位置信息。产生模块506产生一个或多个条件319,用于使用与固定地址验证模块306(见图3)基本上相同的方式来验证存储器边界限制。但是,判定模块504和产生模块506可以是独立的模块。因此,这些独立的模块504、506可以独立地操作,或者可以与诸如编译程序308、汇编程序310、链接程序312或集成开发环境(IDE)等的其他建立处理实用程序集成。
在某些实施例中,产生模块506包括存储器区域判定模块510和区域条件产生模块512,它们以与结合图4所述的存储器区域确定模块410和区域条件产生模块412基本上相同的方式而运作。
在一个实施例中,区域条件产生模块512包括容量计算模块514、汇总模块516和条件产生器518。容量计算模块514确定定制区域的区域容量。通常,所述区域容量包括在LDF315中的定制区域的定义中给出的长度指示符。例如,LDF315可以使用256字节的长度来定义被称为“消息”的定制区域。所述长度指示符对应于定制区域的大小。或者,容量计算模块514可以通过查找所述定制区域的开始偏移量和结束偏移量之间的差来计算该大小。
汇总模块516合计目标代码318所指示的位于定制存储器区域中的每个变量的大小信息。汇总模块516可以引用目标代码318的.bss和.data段以进行这个确定。参照上述的示例,汇总模块516搜索目标代码318并且可以找到被定义为位于或分配在“MESSAGE(消息)”定制区域内的5个数据结构。汇总模块516可以对于所述5个数据结构的大小求和,并且确定组合大小是280字节。
条件产生器518产生区域条件,它包括区域容量和被分配到由汇总模块516提供的定制区域的变量的总的大小。通常,区域条件(和如上所述的存储器地址条件319)是使用诸如<、>、<=、>=、和<>之类的操作符的条件语句。最好是,条件产生器518也产生上下文相关的消息。如上所述,条件产生器518在某些实施例中可以动态地评估区域条件和适当地以信号表示误差。
一个示例区域条件可以是“#error 280>256‘Memory overflow error incustom memory region MESSAGE(在定制存储器区域中的存储器溢出错误)’”。所述条件的值280和256分别被容量计算模块514和汇总模块516提供。在这个示例中,所述区域条件将评估为成立,指示错误条件。上下文相关消息‘Memory overflow error in custom memory region‘message”提供了问题的清楚指示和开发人员可以在何处查看以解决所述错误。
评估模块508被调用来评估存储器地址条件319和区域条件。如上所述,评估模块508可以被体现为源代码预处理器304、402。在某些实施例中,存储器地址条件319和区域条件不同,评估模块508包括用于评估区域条件的区域条件评估模块520。
图6示出了按照一个实施例的用于在建立时识别在源代码中的固定存储器地址错误的方法600的流程图。具体地说,方法600示出了用于处理LDF315和识别固定存储器地址错误的一种方式。一旦程序员期望验证硬编码的存储器地址对于目标硬件存储器平台是精确的,则方法600开始602。或者,一旦软件开发停止并且测试或使用开始,则方法600可以在602开始。为了在602开始处理600,程序员将所有的源代码302编译为目标代码318,但是不启动链接程序312。
接着,在604中预处理器304可以用固定存储器地址值222代替硬编码的存储器地址符号220。或者,在604中置换模块502可以进行置换。最好是,硬编码的存储器地址符号220在源代码302和链接定义文件315之间是公共的。预处理器304可以在源代码302中和在链接定义文件315中执行置换。链接定义文件135或其中并入的文件被修改以包括固定存储器地址值222。
接着,在606中判定模块504确定对于源代码302和LDF315定义的变量和定制存储器区域的大小和位置信息。在608中产生模块506产生条件319以验证由固定存储器地址值222定义的变量。在某些实施例中,在608中产生模块506还产生区域条件,用于验证由固定存储器地址值222定义的定制存储器区域。
在一个实施例中,评估模块508评估条件319和区域条件。最好是,评估模块508包含源代码预处理器304。接着在612中确定是否违反了条件319或区域条件。如果是,则向程序员报告错误322,或者将其存储以供将来参考。因此,评估步骤610使得程序员可以在完全建立和使用可执行图像324之前识别硬编码的存储器地址错误。
如果没有违反条件319或区域条件,则在616中评估模块508可以调用链接程序312。或者,链接程序312被人工调用。然后方法600在618结束。
图7示出了使用固定存储器地址确认适用程序来在建立时识别在源代码中的固定存储器地址错误的方法700。方法700可以在产生所述软件的实体中由被称为最终用户的程序员或开发人员执行。或者,方法700可以被顾问或作为顾问服务客户机的实体——被称为服务提供者——执行。实现方法700的这样的服务提供者为客户机提供在建立时识别在源代码中的固定存储器地址错误的服务。当然,所述服务提供者也可以执行另外的服务。
一旦服务提供者从事在建立时在源代码中识别固定存储器地址错误,则方法700在702开始。为了开始702,服务提供者可以通过编译源代码302而预先建立最终用户的(客户机的)源代码302以产生目标代码318,而不产生可执行图像。
接着在704中通常由服务提供者定义单个定义文件314。服务提供者可以人工地查看源代码302和LDF315以识别固定存储器地址值222和定义在源代码302和LDF315中被引用的硬编码的存储器地址符号220。可选择地,服务提供者可以修改源代码302和/或LDF315以包括更多的硬编码的存储器地址符号220而不是固定存储器地址值222。
或者,服务提供者可以使用自动工具来提取引用用于预定的头文件的固定存储器地址文件的变量定义。服务提供者也可以选择性地置换固定存储器地址值222,并且人工地或借助于自动工具而定义硬编码的存储器地址符号220。
接着,在706中服务提供者调用固定存储器地址确认实用程序,最好是,所述固定存储器地址确认实用程序执行与结合图3描述的固定地址验证模块306基本上相同的功能。因此,所述固定存储器地址确认实用程序执行所述置换,并且产生如上面讨论的条件319和区域条件。
在708中,服务提供者,或任选地最终用户,可以随后调用源代码建立处理,提供的源代码建立处理包括对于条件319和区域条件的评估。在一个实施例中,源代码建立处理包括调用链接程序312,所述链接程序312引用预先汇编的对象目标318和包括条件319和/或区域条件的LDF 315。
在710中,源代码建立处理评估条件319和/或区域条件以确定是否存在诸如重叠错误和/或溢出错误的固定存储器地址错误。如果发现错误,则在712中服务提供者可以诊断所述错误,并且可选择地纠正所述错误。如果没有发现错误,则在714中源代码建立处理产生代码图像文件324,并且方法700在716处结束。
在某些实施例中,服务提供者也可以教导最终用户如何配置源代码302、LDF 315,定义单个定义文件314,并且/或者使用固定存储器地址确认实用程序。例如,服务提供者可以指令最终用户如何定义单个定义文件以定义与C编程语言源文件302和LDF315都兼容的值和变量定义。当然,服务提供者也可以指定最终用户如何定义与C编程语言源文件302和LDF315都兼容的定制存储器区域。
本领域的技术人员将容易地识别本发明的益处。具体地说,本发明是在建立时而不是在测试或使用期间识别固定存储器地址错误。本发明自动产生对于存储器查看重叠错误和存储器溢出错误的条件。而且,使用诸如单个定义文件之类的公共资源降低了使用错误的固定存储器地址值的机会,因为相对于在同一定义文件中的现有固定存储器地址值,可以容易地查看新增加的固定存储器地址值。
在不脱离本发明的精神和必要特征的情况下,本发明可以被体现为其他特定形式中。所述的实施例在所有方面都应当被考虑为仅仅是说明性和非限定性的。因此,由所附的权利要求而不是上述的定义来指示本发明的范围。在权利要求的等同内容的含义和范围内的所有改变被包括在它们的范围内。
在本说明书中所述的功能单元的许多已经被标注为模块,以便更具体的强调它们的实现的独立性。例如,模块可以被实现为硬件电路,它包括定制超大规模集成电路或门阵列、现成的半导体,所述半导体诸如逻辑芯片、晶体管或其他离散部件。模块也可以被实现在可编程的硬件器件中,诸如现场可编程门阵列、可编程阵列逻辑或可编程逻辑器件等。
模块也可以被实现为由各种处理器执行的软件。可执行代码的被识别的模块可以例如包括计算机指令的一个或多个物理或逻辑块,它们可以例如被组织为对象、规程、功能或其他结构。尽管如此,被识别的模块的可执行内容不必被物理地定位在一起,而是可以包括在不同位置中存储的根本不同的指令,它们当逻辑上结合在一起时,包括所述模块和实现所述模块的所述目的。
实际上,可执行代码的模块可以是单个指令或多个指令,并且可以甚至被分布在几个不同的代码段上、在不同的程序之间和在几个存储器上。类似地,操作数据可以在此在模块内被识别和说明,并且可以被体现为任何适当形式和编制在任何适当类型的数据结构中。操作数据可以被收集为单个数据集,或者可以被分布在包括不同的存储器件的不同位置上,并且可以仅仅作为在系统或网络上的电子信号而至少部分地存在。
在本说明书中对于“一选择实施例”、“一个实施例”或“一实施例”的引用表示在本发明的至少一个实施例中包括结合所述实施例所述的特定特征、结构或特性。因此,在本说明书中的各种位置的措词“一选择实施例”、“一个实施例”或“一个实施例”的出现不必然都引用同一实施例。
而且,可以在一个或多个实施例中以任何的方式来组合所述特征、结构或特性。在随后的说明中,提供了多种具体细节,诸如编程、软件模块、用户选择、用户界面、网络交易、数据库查询、数据库结构、硬件模块、硬件电路、硬件芯片等的示例,以提供对于本发明的实施例的彻底了解。但是,本领域的技术人员将识别出可以在没有一个或多个所述特定细节的情况下或者使用其他方法、部件、材料等来实践本发明。在其他实例中,不详细示出或说明公知的结构、材料或操作以避免混淆本发明的多个方面。
权利要求
1.一种用于在建立时识别在源代码中的固定存储器地址错误的装置,所述装置包括置换模块,被配置来用固定的存储器地址值置换硬编码的存储器地址符号,在编译源代码和链接来自源代码编译的目标代码中都使用的公共资源中定义在固定存储器地址值和硬编码的存储器地址符号之间的映射;判定模块,被配置来通过引用目标代码而确定与硬编码的存储器地址符号相关联的变量的大小和位置信息;产生模块,被配置来根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件;以及评估模块,被配置来评估所述条件和响应于违反所述条件之一而发出表示错误的信号。
2.如权利要求1的装置,还包括存储器区域判定模块,被配置来确定由硬编码的存储器地址符号至少部分地定义的定制存储器区域的大小和位置信息;区域条件产生模块,被配置来根据用于指定每个定制存储器区域的变量的累积大小产生一个或多个验证存储器区域满足存储器区域容量限制的区域条件;以及区域条件评估模块,被配置来评估所述区域条件和响应于违反所述条件之一而发出表示错误的信号。
3.如权利要求2的装置,其中在所述公共资源中定义的定制存储器区域被源代码和用于链接目标代码的链接命令文件引用。
4.如权利要求2的装置,其中所述区域条件产生模块包括容量计算模块,被配置来根据定制存储器区域的大小而确定每个区域的区域容量;汇总模块,被配置来汇总被分配到定制存储器区域的每个变量的大小信息;以及条件产生器,被配置来产生将每个定制存储器区域的汇总大小信息和区域容量相比较的条件,并产生与上下文相关的错误消息。
5.如权利要求1的装置,其中所述评估模块包括在源代码预处理器内的逻辑,并且所述条件被配置来通过源代码预处理器评估。
6.如权利要求1的装置,其中所述条件包括识别变量和错误类型的上下文有关的错误消息。
7.如权利要求6的装置,其中所述错误类型包括重叠错误和溢出错误。
8.如权利要求1的装置,其中所述公共资源还包括通过开始地址和结束地址而定义定制存储器区域的值,所述定制存储器区域被在源代码和在链接命令文件中都被引用的存储器区域符号表示,所述链接命令文件被提供到链接目标代码的链接程序。
9.如权利要求1的装置,其中所述资源包括公共定义文件。
10.如权利要求9的装置,其中所述公共定义文件可以被包括在源代码文件和链接命令文件中。
11.一种用于在建立时识别在源代码中的固定存储器地址错误的装置,所述装置包括源代码预处理器,被配置来用一个值置换位置保持符,在值和位置保持符之间的映射被定义在公共定义文件中,所述公共定义文件被源代码的编译程序和链接程序引用,所述链接程序被配置来链接从源代码编译的目标代码;固定地址验证模块,被配置来搜索至少一个与位置保持符相关联的变量的大小和位置信息,并且根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件;以及后处理器,被配置来通过源代码预处理器发送所述用于评估的条件,以便违反所述条件之一时以信号来指示错误。
12.如权利要求11的装置,其中所述公共定义文件包括定制存储器区域的定义,所述装置还包括存储器区域判定模块,被配置来确定由位置保持符至少部分地定义的定制存储器区域的大小和位置信息;区域条件产生模块,被配置来根据指定定制存储器区域的变量的累积大小产生一个或多个验证存储区域满足存储区域容量限制的区域条件,并且其中所述区域条件被配置来通过源代码预处理器评估,以便违反区域条件之一时以信号来表示错误。
13.如权利要求12的装置,其中定制存储器区域被源代码文件和链接命令文件引用。
14.如权利要求13的装置,其中,通过开始地址和长度来定义定制存储器区域,由在源代码和被提供到链接程序的链接命令文件中都引用的存储器区域符号表示定制存储器区域。
15.如权利要求14的装置,其中,所述值包括固定存储器地址值,所述位置保持符包括硬编码的存储器地址符号。
16.一种用于在建立时识别在源代码中的固定存储器地址错误的系统,包括一组源代码,包括一个或多个公共头文件,所述头文件包括映射到固定存储器地址值的硬编码的存储器地址符号,所述硬编码的存储器地址符号由在源代码中和在链接命令文件中的变量使用;预处理器,被配置来预处理适当配置的链接命令文件,所述适当配置的链接命令文件引用所述公共头文件,以便在所述公共头文件中的硬编码的存储器地址符号被置换为固定存储器地址值并将该结果存储在中间文件中;固定地址验证模块,被配置来读取所述中间文件,为硬编码的存储器地址符号相关联的至少一个变量搜索源代码编译的目标文件中的大小和位置信息,根据所述大小和位置信息产生验证满足存储器边界限制的变量的一个或多个条件,并且在修改的链接命令文件中存储所述一个或多个条件,以便使用预处理器来重新处理所述修改的链接命令文件,评估所述条件以便违反所述条件之一时以信号指示错误;编译程序,被配置来将源代码编译为汇编的代码;汇编程序,被配置来将所述汇编代码汇编为目标代码;以及链接程序,被配置来通过按照被修改的链接命令文件而链接库数据和目标代码来产生图像文件。
17.如权利要求16的系统,其中所述链接程序被配置来以信号表示在公共头文件中定义的定制存储器区域的溢出。
18.如权利要求16的系统,还包括预建立器,被配置来调用所述编译程序和汇编程序,以从所述一组源代码产生目标代码,而不调用链接程序,所述目标代码被固定地址验证模块引用。
19.一种信号承载介质,有形地体现机器可读指令的程序,所述机器可读指令的程序可以由数字处理装置执行来执行在建立时识别在源代码中的固定存储器地址错误的操作,所述操作包括用固定存储器地址值置换硬编码的存储器地址符号的操作;通过引用目标代码而确定与硬编码的存储器地址符号相关联的变量的大小和位置信息的操作;根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件的操作;以及评估所述条件和响应于违反所述条件之一时发出表示错误的信号的操作。
20.如权利要求19的信号承载介质,还包括操作确定由硬编码的存储器地址符号至少部分地定义的定制存储器区域的大小和位置信息的操作;根据指定每个定制存储器区域的变量的累积大小产生一个或多个验证定制存储器区域满足存储器区域容量限制的区域条件的操作;以及评估所述区域条件和响应于违反所述条件之一时发出表示错误的信号。
21.如权利要求20的信号承载介质,其中在由源代码和用于链接目标代码的链接命令文件引用的所述公共资源中定义定制存储器区域。
22.如权利要求20的信号承载介质,其中产生一个或多个区域条件的操作还包括根据定制存储器区域的大小而确定每个区域的区域容量的操作;汇总被分配到定制存储器区域的每个变量的大小信息的操作;以及产生将每个定制存储器区域的汇总大小信息和区域容量与上下文相关错误消息相比较的条件的操作。
23.如权利要求19的信号承载介质,其中评估条件的操作包括将条件通过源代码预处理器内的操作,所述条件被配置来通过源代码预处理器评估。
24.如权利要求19的信号承载介质,其中所述条件包括识别变量和错误类型的上下文有关的错误消息。
25.如权利要求24的信号承载介质,其中所述错误类型包括重叠错误和溢出错误。
26.如权利要求19的信号承载介质,其中所述硬编码的存储器地址符号还包括由指定开始地址和结束地址的值定义的定制存储器区域,所述定制存储器区域由在源代码和在链接命令文件中都被引用的存储器区域符号表示,所述链接命令文件被提供到用于链接目标代码的链接程序。
27.如权利要求19的信号承载介质,其中所述硬编码的存储器地址符号被定义在公共定义文件中。
28.如权利要求19的信号承载介质,其中置换硬编码的存储器地址值的操作包括将硬编码的存储器地址符号的定义与链接命令文件组合的操作。
29.一种用于在建立时识别在源代码中的固定存储器地址错误的方法,所述方法包括用固定存储器地址值置换硬编码的存储器地址符号;通过引用目标代码而确定与硬编码的存储器地址符号相关联的变量的大小和位置信息;根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件;以及评估所述条件和响应于违反所述条件之一时发出表示错误的信号。
30.如权利要求29的方法,还包括确定由硬编码的存储器地址符号至少部分地定义的定制存储器区域的大小和位置信息;根据指定每个定制存储器区域的变量的累积大小产生一个或多个验证存储器区域满足存储器区域容量限制的区域条件;以及评估所述区域条件和响应于违反所述条件之一时发出表示错误的信号。
31.如权利要求30的方法,其中在由源代码和用于链接目标代码的链接命令文件引用的所述公共资源中定义定制存储器区域。
32.如权利要求29的方法,其中评估所述条件包括操作调用源代码预处理器,所述源代码预处理器评估与源代码预处理器兼容的条件。
33.一种用于向客户机提供用于在建立时识别在源代码中的固定存储器地址错误的服务的方法,包括步骤定义单个定义文件,单个定义文件包括映射到固定存储器地址值的硬编码的存储器地址符号,在源代码和链接命令文件中都引用所述硬编码的存储器地址符号;调用所述固定存储器地址确认实用程序,所述固定存储器地址确认实用程序用固定存储器地址值置换如在所述定义文件中所示的链接命令文件中的硬编码的存储器地址符号,并且产生被配置来验证与固定存储器地址值相关联的变量满足存储器边界限制的条件,所述条件可被源代码建立处理的软件模块读取;并且调用所述源代码建立过程,所述源代码建立处理评估所述条件和响应于违反所述条件之一时向用户通知错误。
34.如权利要求33的方法,还包括使用预汇编的目标代码和包括所述条件的链接命令文件来调用链接程序,所述链接程序响应于被基本上满足的条件而产生可执行的代码图像,所述可执行的代码图像基本上没有固定存储器地址错误。
35.如权利要求33的方法,其中定义单个定义文件包括从现有的头文件和源代码文件提取引用固定存储器地址值的变量定义,选择性地将固定存储器地址值置换为硬编码的存储器地址符号,并且将硬编码的存储器地址符号的定义组合到所述单个定义文件中。
36.如权利要求33的方法,其中服务提供者定义单个定义文件,并且调用固定存储器地址确认实用程序和最终用户调用源代码建立处理,用于评估所述条件和向用户通知错误。
37.如权利要求33的方法,还包括通过将源代码编译为目标代码而不产生可执行映像来预先建立客户机的源代码,所述目标代码被固定存储器地址确认实用程序引用来得到与硬编码的存储器地址符号相关联的变量的大小和位置信息。
38.如权利要求33的方法,还包括指令客户机如何使用C编程语言来定义所述单个定义文件,以便在所述定义文件中的定义可兼容用于源代码和链接命令文件中。
39.如权利要求33的方法,还包括指令客户机如何使用C编程语言来定义所述单个定义文件,以便在所述定义文件中的定制存储器区域可兼容用于源代码和链接命令文件中。
40.一种用于在建立时识别在源代码中的固定存储器地址错误的装置,所述装置包括用于用固定的存储器地址值置换硬编码的存储器地址符号的部件,在用于编译源代码并且用于链接从源代码编译的目标代码的公共资源中定义在固定存储器地址值和硬编码的存储器地址符号之间的映射;用于通过引用目标代码而确定与硬编码的存储器地址符号相关联的变量的大小和位置信息的部件;用于根据所述大小和位置信息产生一个或多个验证所述变量满足存储器边界限制的条件的部件;和用于响应于违反所述条件之一时评估该条件和发出表示错误的信号的部件。
全文摘要
本发明提供了一种装置、系统和方法,用于在建立时识别在源代码中的固定存储器地址错误。本发明包括置换模块,它用固定的存储器地址值置换硬编码的存储器地址符号。按照在固定存储器地址值和硬编码的存储器地址符号之间的映射而置换所述固定的存储器地址值。判定模块通过引用目标代码而确定与硬编码的存储器地址符号相关联的变量的大小和位置信息。产生模块根据由判定模块提供的大小和位置信息产生一个或多个条件和/或存储器区域条件,来验证存储器边界和/或容量限制。评估模块评估所述条件,并且响应于违反所述条件和/或存储器区域条件之一而发出表示错误的信号。评估模块可以是传统的建立处理部件,诸如传统源代码预处理器。
文档编号G06F9/45GK1776620SQ20051012478
公开日2006年5月24日 申请日期2005年11月15日 优先权日2004年11月15日
发明者查尔斯·S·卡迪内尔 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1