gpt4 book ai didi

c - Ada 中的无约束数组可以安全使用吗?

转载 作者:行者123 更新时间:2023-12-02 16:15:25 25 4
gpt4 key购买 nike

我在阅读 Ada 中的数组类型时发现有趣的是,与 C++ 不同,该语言允许它们的大小在编译时未知。我不确定它们是如何实现的,所以我写了一个小测试:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Command_Line; use Ada.Command_Line;

procedure Main is
type Data is array (1 .. 131_072) of Integer;
type Vector is array (Positive range <>) of Data;
Sequence : Vector (1 .. Argument_Count);
begin
for I in Sequence'Range loop
Sequence (I) := (others => I);
Put (Integer'Image (Sequence (I)(1)));
end loop;
end Main;

然后尝试使用可变长度数组在 C 中复制这段代码:

#include <stdio.h>

struct data {
int x[131072];
};

int main(int argc, char** argv) {
(void)argv;
struct data sequence[argc - 1];
for (int i = 0; i < argc - 1; i++) {
for (int j = 0; j < 131072; j++)
sequence[i].x[j] = i;
printf("%i ", sequence[i].x[1]);
}
}

我用 gnatmake -gnato -fstack-check -gnat2012 -gnata -O3 main.adb -o maingcc -O3 -Wall -Werror -Wextra -pedantic cmain 编译了两者。 c -o cmain.运行程序后,当给定 16 个或更多参数时,两者都失败了 - 区别在于 cmain 只是出现段错误,而 main 最终引发“STORAGE_ERROR:堆栈溢出或错误的内存访问".

由于 VLA 和无约束阵列似乎(至少在表面上)以类似的方式实现,并且前者被广泛认为几乎在所有情况下都不能安全使用,那么使用后者安全吗?

最佳答案

Ada 中不受约束的数组类型本身并不是不安全的;使用未经检查的输入值(例如 Argument_Count)来创建该大小的数组对象是不安全的,或者至少可能导致异常。如果您这样做,并且没有异常处理程序,攻击者可以使您的程序中止并出现未处理的异常,如您的示例所示。

请注意,在 Ada 中以两种方式使用无约束数组类型:

  1. 创建动态确定大小的数组对象,如您的示例所示。
  2. 将各种大小的数组作为参数传递给子程序,即使实际数组对象具有静态定义的大小也是如此。

第二次使用(参数)当然是完全安全的,参数的实际边界可以像往常一样通过 A'First、A'Last、A'Range、A'Length 访问。

关于c - Ada 中的无约束数组可以安全使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66893936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com