静态声明上的EXCEPTION_ACCESS_VIOLATION

时间:2017-09-12 11:42:58

标签: ada

我是for ***'Address use ***的新用户。我想知道这种用法的限制是什么。所以我创建了以下过程:

procedure letshack (A : System.Address) is 
      My_String : String(1..100000);
      for My_String'Address use A;
   begin 
      Put(My_String);
   end;

这会引发EXCEPTION_ACCESS_VIOLATION,同时使用100长度的字符串的相同代码不会引发它。更重要的是,如果我不使用整数地址,此代码可以正常工作。

那么for ***'Address use ***使用的限制是什么。 Ps:我正在使用Ada 95,但欢迎任何信息。

编辑: 我理解这部分行为。这就是我想的。 当您启动程序时,会分配一定的堆栈,您可以在其中进行写入和读取。实际上我用整数地址写了第5个字节

Real Addresses |----------------------------| Virtual Addresses
        0x48000|Stack Origine               |0x00
               |                            |
               |                            |
               |                            |
               |                            |
               |End of Stack                |
  0x48000+range|----------------------------|0x00+range

如果您不在堆栈中,您将获得EXCEPTION_ACCESS_VIOLATION。对于一个强大的人来说,这似乎很奇怪。语言是否正确。因为这意味着你可以重写自己的堆栈并使其表现不好。

2 个答案:

答案 0 :(得分:0)

如果您已确保在A开始的内存可读部分中分配了100_000个连续字符,那么它应该可以正常工作。

如果A是另一个Ada实体的地址,则不应该有效。

答案 1 :(得分:0)

Finnaly发现了这种行为。 当您启动程序时,您使用的地址是页面中的虚拟地址。 并且处理虚拟地址的系统部分使其分配给您的进程的特定大小的内存,这取决于您的系统,如下所示:

Real Addresses |----------------------------| Virtual Addresses
        0x48000|Begin of the virtual address|0x00
               |range                       |
               |                            |
               |                            |
               |End of the virtual address  |
               |range                       |
  0x48000+range|----------------------------|0x00+range

您可以在不分配变量的情况下执行任何操作。例如,根据4096 bytes中的变量si.dwPageSize,在我的窗口上,此尺寸为<windows.h>。 我测试我的String可以是4096字节长但不是4097字节。我现在必须在我的嵌入式系统上测试它,但似乎接近事实。