File: testdebugallocator.cc

package info (click to toggle)
dune-common 2.10.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,824 kB
  • sloc: cpp: 52,256; python: 3,979; sh: 1,658; makefile: 17
file content (113 lines) | stat: -rw-r--r-- 2,042 bytes parent folder | download | duplicates (4)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception

// #define DEBUG_ALLOCATOR_KEEP 1
#define DEBUG_NEW_DELETE 3

#include <dune/common/debugallocator.hh>
#if HAVE_MPROTECT

#include <iostream>
#include <csignal>
#include <cstdlib>
#include <vector>

class A
{
public:
  A() { std::cout << "INIT A\n"; }
  int x;
  void foo() {};
};

void basic_tests ()
{
  using Dune::DebugMemory::alloc_man;

  size_t s = 256;
  double * x = alloc_man.allocate<double>(s);
  x[s-1] = 10;

  // access out of bounds
#ifdef FAILURE1
  x[s+1] = 1;
#endif

  // lost allocation, free and double-free
#ifndef FAILURE2
  alloc_man.deallocate<double>(x);
#endif
#ifdef FAILURE3
  alloc_man.deallocate<double>(x);
#endif

  // access after free
#ifdef FAILURE4
  x[s-1] = 10;
#endif
}

void allocator_tests()
{
  std::vector<double, Dune::DebugAllocator<double> > v;
  v.push_back(10);
  v.push_back(12);
  [[maybe_unused]] int size = v.size();
  std::cout << v[0] << "\n";
  std::cout << v[1] << "\n";
#ifdef FAILURE5
  std::cout << v[v.capacity()] << "\n";
#endif
}

void new_delete_tests()
{
  std::cout << "alloc double[3]\n";
  double * y = new double[3];
  delete[] y;

  std::cout << "alloc A[2]\n";
  A * z = new A[2];
  z->foo();
  delete[] z;
  z = 0;

  std::cout << "alloc (buf) A[3]\n";
  char * buf = (char*)malloc(128);
  A * z2 = new (buf) A[3];
  z2->foo();
  free(buf);
  z2 = 0;

  std::cout << "alloc A[4]\n";
  A * z4 = ::new A[4];
  z4->foo();
  ::delete[] z4;
  z4 = 0;
}

#endif // HAVE_MPROTECT

int main(int, char**)
{
#if EXPECTED_SIGNAL
  std::signal(EXPECTED_SIGNAL, std::_Exit);
#endif
#if EXPECTED_ALT_SIGNAL
  std::signal(EXPECTED_ALT_SIGNAL, std::_Exit);
#endif

#if HAVE_MPROTECT
  basic_tests();
  allocator_tests();
  new_delete_tests();
#endif

#ifdef EXPECTED_SIGNAL
  return 1;
#else
  return 0;
#endif
}