📄 cb10002.a
字号:
-- CB10002.A-- Grant of Unlimited Rights---- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained-- unlimited rights in the software and documentation contained herein.-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making-- this public release, the Government intends to confer upon all-- recipients unlimited rights equal to those held by the Government.-- These rights include rights to use, duplicate, release or disclose the-- released technical data and computer software in whole or in part, in-- any manner and for any purpose whatsoever, and to have or permit others-- to do so.---- DISCLAIMER---- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A-- PARTICULAR PURPOSE OF SAID MATERIAL.--*---- OBJECTIVE:-- Check that Storage_Error is raised when storage for allocated objects-- is exceeded.---- TEST DESCRIPTION:-- This test allocates a very large data structure.---- In order to avoid running forever on virtual memory targets, the-- data structure is bounded in size, and elements are larger the longer-- the program runs.---- The program attempts to allocate about 8,600,000 integers, or about-- 32 Megabytes on a typical 32-bit machine.---- If Storage_Error is raised, the data structure is deallocated.-- (Otherwise, Report.Result may fail as memory is exhausted).-- CHANGE HISTORY:-- 30 Aug 85 JRK Ada 83 test created.-- 14 Sep 99 RLB Created Ada 95 test.with Report;with Ada.Unchecked_Deallocation;procedure CB10002 is type Data_Space is array (Positive range <>) of Integer; type Element (Size : Positive); type Link is access Element; type Element (Size : Positive) is record Parent : Link; Child : Link; Sibling: Link; Data : Data_Space (1 .. Size); end record; procedure Free is new Ada.Unchecked_Deallocation (Element, Link); Holder : array (1 .. 430) of Link; Last_Allocated : Natural := 0; procedure Allocator (Count : in Positive) is begin -- Allocate various sized objects similar to what a real application -- would do. if Count in 1 .. 20 then Holder(Count) := new Element (Report.Ident_Int(10)); elsif Count in 21 .. 40 then Holder(Count) := new Element (Report.Ident_Int(79)); elsif Count in 41 .. 60 then Holder(Count) := new Element (Report.Ident_Int(250)); elsif Count in 61 .. 80 then Holder(Count) := new Element (Report.Ident_Int(520)); elsif Count in 81 .. 100 then Holder(Count) := new Element (Report.Ident_Int(1000)); elsif Count in 101 .. 120 then Holder(Count) := new Element (Report.Ident_Int(2048)); elsif Count in 121 .. 140 then Holder(Count) := new Element (Report.Ident_Int(4200)); elsif Count in 141 .. 160 then Holder(Count) := new Element (Report.Ident_Int(7999)); elsif Count in 161 .. 180 then Holder(Count) := new Element (Report.Ident_Int(15000)); else -- 181..430 Holder(Count) := new Element (Report.Ident_Int(32000)); end if; Last_Allocated := Count; end Allocator;begin Report.Test ("CB10002", "Check that Storage_Error is raised when " & "storage for allocated objects is exceeded"); begin for I in Holder'range loop Allocator (I); end loop; Report.Not_Applicable ("Unable to exhaust memory"); for I in 1 .. Last_Allocated loop Free (Holder(I)); end loop; exception when Storage_Error => if Last_Allocated = 0 then Report.Failed ("Unable to allocate anything"); else -- Clean up, so we have enough memory to report on the result. for I in 1 .. Last_Allocated loop Free (Holder(I)); end loop; Report.Comment (Natural'Image(Last_Allocated) & " items allocated"); end if; when others => Report.Failed ("Wrong exception raised by heap overflow"); end; Report.Result;end CB10002;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -