我正在开发一个工具,用于在Ada源code.for中查找子类型范围溢出问题。目的是使用ASIS在Ada源代码中查找赋值语句,并在赋值expression.now的右侧查找变量类型--我想将赋值表达式中的变量(而不是记录类型)替换为赋值语句中变量类型的最后一个值,以便如果任何范围溢出happens.below都是我要传达的示例,则将得到编译错误。
procedure Example is
subtype A_Type is integer 1 .. 10;
subtype B_Type is integer -5 .. 5;
subtype C_Type is integer 1 .. 12;
A : A_Type;
B : B_Type;
C : C_Type;
begin
C := A + B;
end Example;
我希望在源代码中使用C := A_Type'Last + B_Type'Last
修改C := A_Type'Last + B_Type'Last
。C := A_Type'Last + B_Type'Last
赋值语句将在编译时收到警告或在运行时得到约束错误。
是否有可能用ASIS进行上述修改?
发布于 2018-06-20 15:54:35
出于您的目的,您不应该重写您正在处理的源文本的。您应该编写一个新的程序,它只包含所需的声明和分配。
所以输出应该是这样的:
with Type_Declarations;
procedure Test_Driver is
begin
declare
C : Type_Declarations.C_Type;
begin
C := Type_Declarations."+" (Type_Declarations.A_Type'First, Type_Declarations.B_Type'First);
C := Type_Declarations."+" (Type_Declarations.A_Type'First, Type_Declarations.B_Type'Last);
C := Type_Declarations."+" (Type_Declarations.A_Type'Last, Type_Declarations.B_Type'First);
C := Type_Declarations."+" (Type_Declarations.A_Type'Last, Type_Declarations.B_Type'Last);
end;
end Test_Driver;
发布于 2018-06-20 10:57:18
ASIS的设计并不是为了做出这样的修改。不过,您可以从AdaCore上查看一下AdaCore,它支持这一点(并且工作在部分源代码上,因此不必预编译源代码)。
发布于 2018-06-20 11:27:12
GNAT包括实用程序gnat2xml
和xml2gnat
;gnat2xml
基于ASIS生成源的表示,xml2gnat
将其转换回Ada。您可以修改第一个文件的XML输出并将其反馈给第二个输出。
这并不是我推荐的;XML模式没有文档化,而且很复杂。
https://stackoverflow.com/questions/50946512
复制相似问题