File: max_malloc_size.cpp

package info (click to toggle)
cbmc 6.6.0-4
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 153,852 kB
  • sloc: cpp: 386,459; ansic: 114,466; java: 28,405; python: 6,003; yacc: 4,552; makefile: 4,041; lex: 2,487; xml: 2,388; sh: 2,050; perl: 557; pascal: 184; javascript: 163; ada: 36
file content (63 lines) | stat: -rw-r--r-- 1,971 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*******************************************************************\

Module: Unit test for max_malloc_size

Author: Thomas Kiley

\*******************************************************************/

#include <util/config.h>

#include <testing-utils/use_catch.h>

TEST_CASE("max_malloc_size", "[core][util][config][max_malloc_size]")
{
  cbmc_invariants_should_throwt throw_invariants;

  configt config_backup = config;

  SECTION("Too many bits for pointer ID")
  {
    config.ansi_c.pointer_width = 4;
    config.bv_encoding.object_bits = 4;
    REQUIRE_THROWS_AS(config.max_malloc_size(), invariant_failedt);
    config.bv_encoding.object_bits = 5;
    REQUIRE_THROWS_AS(config.max_malloc_size(), invariant_failedt);
  }

  SECTION("Not enough bits for pointer ID")
  {
    config.ansi_c.pointer_width = 4;
    config.bv_encoding.object_bits = 0;
    REQUIRE_THROWS_AS(config.max_malloc_size(), invariant_failedt);
  }

  SECTION("Not enough bits in the pointer")
  {
    config.ansi_c.pointer_width = 0;
    config.bv_encoding.object_bits = 0;
    REQUIRE_THROWS_AS(config.max_malloc_size(), invariant_failedt);
  }

  SECTION("Valid allocation size configurations")
  {
    // The one bit offset can be used to store 0, or -1, so we can allocate
    // a single bit
    config.ansi_c.pointer_width = 4;
    config.bv_encoding.object_bits = 3;
    REQUIRE(config.max_malloc_size() == 1);
    // Here we use 4 bits for the object ID, leaving 3 for the offset
    config.ansi_c.pointer_width = 8;
    config.bv_encoding.object_bits = 4;
    REQUIRE(config.max_malloc_size() == 8);
    config.ansi_c.pointer_width = 128;
    config.bv_encoding.object_bits = 64;
    REQUIRE(config.max_malloc_size() == 9223372036854775808ull /*2^63*/);
    config.bv_encoding.object_bits = 63;
    REQUIRE(
      config.max_malloc_size() == string2integer("18446744073709551616"
                                                 /*2^64*/));
  }

  std::swap(config_backup, config);
}