Apply patch for [CVE-2012-2677][boost] ordered_malloc() overflow
[external/boost.git] / libs / smart_ptr / test / collector_test.cpp
1 //
2 //  collector_test.cpp
3 //
4 //  Copyright (c) 2003 Peter Dimov
5 //
6 // Distributed under the Boost Software License, Version 1.0. (See
7 // accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10
11 #include <boost/shared_ptr.hpp>
12 #include <vector>
13 #include <iostream>
14 #include <cstdlib>
15 #include <ctime>
16
17 // sp_collector.cpp exported functions
18
19 std::size_t find_unreachable_objects(bool report);
20 void free_unreachable_objects();
21
22 struct X
23 {
24     void* fill[32];
25     boost::shared_ptr<X> p;
26 };
27
28 void report()
29 {
30     std::cout << "Calling find_unreachable_objects:\n";
31
32     std::clock_t t = std::clock();
33
34     std::size_t n = find_unreachable_objects(false);
35
36     t = std::clock() - t;
37
38     std::cout << n << " unreachable objects.\n";
39     std::cout << "  " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n";
40 }
41
42 void free()
43 {
44     std::cout << "Calling free_unreachable_objects:\n";
45
46     std::clock_t t = std::clock();
47
48     free_unreachable_objects();
49
50     t = std::clock() - t;
51
52     std::cout << "  " << static_cast<double>(t) / CLOCKS_PER_SEC << " seconds.\n";
53 }
54
55 int main()
56 {
57     std::vector< boost::shared_ptr<X> > v1, v2;
58
59     int const n = 256 * 1024;
60
61     std::cout << "Filling v1 and v2\n";
62
63     for(int i = 0; i < n; ++i)
64     {
65         v1.push_back(boost::shared_ptr<X>(new X));
66         v2.push_back(boost::shared_ptr<X>(new X));
67     }
68
69     report();
70
71     std::cout << "Creating the cycles\n";
72
73     for(int i = 0; i < n - 1; ++i)
74     {
75         v2[i]->p = v2[i+1];
76     }
77
78     v2[n-1]->p = v2[0];
79
80     report();
81
82     std::cout << "Resizing v2 to size of 1\n";
83
84     v2.resize(1);
85     report();
86
87     std::cout << "Clearing v2\n";
88
89     v2.clear();
90     report();
91
92     std::cout << "Clearing v1\n";
93
94     v1.clear();
95     report();
96
97     free();
98     report();
99 }