Array(Array'First)“数组索引检查可能失败”

时间:2018-10-29 10:23:06

标签: ada codepeer

在使用CodePeer分析Ada代码库时,该工具在执行此操作的行中报告“数组索引检查可能失败”

Param(Param'First) := ....

Param是一个传入的out参数-它是数组类型。

我的理解是Ada在运行时会携带数组大小和有效的索引范围(以便执行范围检查)...我看不到任何Ada数组如何通过访问索引{{1}来违反其范围检查}。

我想念什么?

2 个答案:

答案 0 :(得分:4)

您可以声明一个空范围的数组

array(1..0)
array(10..5)
array(1337..-1)

在这种情况下,Param'First将大于Param'Last,并且索引检查将失败。

我猜想Param是不受约束的数组类型,例如String,f.eks?

type String is array(Positive range <>) of Character;

然后可以将任何类型的对象声明为空字符串:

Foo : String(1..0);

然后作为参数传递给您的子程序

答案 1 :(得分:3)

您可以通过为不受约束的数组类型赋予动态谓词来防止该问题,该谓词表示数组不能为空:

subtype Non_Empty_String is String
  with Dynamic_Predicate => Non_Empty_String'Length >= 1;