在GNAT预定义库中检测匿名分配

时间:2018-07-11 13:15:46

标签: ada dynamic-allocation restrictions

因此,我正在开发一个Ada 2012库,该库不应执行默认池中的分配。所有这些都应使用用户指定的存储池。

我正在使用一些预定义的程序包,其中一些显然不符合规则:例如,不确定的容器。我想确定我没有使用我不应该使用的东西。

我认为某些实用程序限制可能会有所帮助,但以下任何一项都不会抱怨:

pragma Restrictions (No_Allocators);
pragma Restrictions (No_Anonymous_Allocators);
pragma Restrictions (No_Implicit_Heap_Allocations);
pragma Restrictions (No_Standard_Allocators_After_Elaboration);
pragma Restrictions (No_Standard_Storage_Pools);

with Ada.Containers.Indefinite_Vectors;

procedure Anon is
   package Vectors is new Ada.Containers.Indefinite_Vectors (Positive, String);

   V : Vectors.Vector;
begin
   V.Append ("Mmm");
end Anon;

我不确定为什么未检测到它,或者应该检测到它(即使是预编译的,编译器库也应具有包含此信息的.ali文件)。如果没有,有办法吗?

这是在a-coinve.ads中声明的指针类型,没有任何存储池:type Elements_Access is access all Elements_Type;在带有常规new的主体中使用。

(编辑以澄清,我的意思是指默认池中的分配,而不是匿名访问类型)。

1 个答案:

答案 0 :(得分:2)

如果我没记错的话,您可以覆盖所有访问类型(包括在标准库中声明的访问类型)的默认存储池。

我发现的第一个选项是LRM中的13.11.3。它看起来不太像我所记得的,但就我所知,用作配置实用程序的pragma Default_Storage_Pool (null);也应涵盖运行时库。