数组(数组'第一个)"array index check might fail"
Array(Array'First) "array index check might fail"
在使用 CodePeer 分析 Ada 代码库时,该工具报告 "array index check might fail" 在执行此操作的行中:
Param(Param'First) := ....
Param 是传入的out
参数 - 并且是数组类型。
我的理解是 Ada 在运行时携带数组大小和有效索引范围(以便执行范围检查)...我看不出任何 Ada 数组如何通过访问索引来违反其范围检查 array'First
.
我错过了什么?
你可以声明一个空范围的数组,
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);
然后作为参数传递给您的子程序
您可以通过为不受约束的数组类型指定一个动态谓词来防止出现此问题,该谓词表示数组不能为空:
subtype Non_Empty_String is String
with Dynamic_Predicate => Non_Empty_String'Length >= 1;
在使用 CodePeer 分析 Ada 代码库时,该工具报告 "array index check might fail" 在执行此操作的行中:
Param(Param'First) := ....
Param 是传入的out
参数 - 并且是数组类型。
我的理解是 Ada 在运行时携带数组大小和有效索引范围(以便执行范围检查)...我看不出任何 Ada 数组如何通过访问索引来违反其范围检查 array'First
.
我错过了什么?
你可以声明一个空范围的数组,
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);
然后作为参数传递给您的子程序
您可以通过为不受约束的数组类型指定一个动态谓词来防止出现此问题,该谓词表示数组不能为空:
subtype Non_Empty_String is String
with Dynamic_Predicate => Non_Empty_String'Length >= 1;