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

tts*_*ras 2 ada codepeer

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

Param(Param'First) := ....
Run Code Online (Sandbox Code Playgroud)

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

我的理解是 Ada 在运行时携带数组大小和有效索引范围(为了执行范围检查)......我看不出任何 Ada 数组如何通过访问 index 来违反其范围检查array'First

我错过了什么?

egi*_*lhh 5

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

array(1..0)
array(10..5)
array(1337..-1)
Run Code Online (Sandbox Code Playgroud)

等等。

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

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

type String is array(Positive range <>) of Character;
Run Code Online (Sandbox Code Playgroud)

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

Foo : String(1..0);
Run Code Online (Sandbox Code Playgroud)

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

  • 函数可以返回数组对象,例如`Ada.Text_IO.Get_Line`。有时,该行是空的(例如,如果用户仅按下 Enter 键)。在这种情况下,返回的数组也需要为空。 (2认同)