1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string>
4 #include <sstream>
5 #include "../memcheck.h"
6 // Derived from test provided by Timur Iskhodzhanov (bug 280271)
7
8 class MyClass
9 {
10 public:
~MyClass()11 ~MyClass()
12 { fprintf(stderr, "destruct MyClass\n");
13 }
14 };
15
16 // Two hierarchies using MI, one with no fields,
17 // the other one with some data.
18 struct Ae
19 {
~AeAe20 virtual ~Ae()
21 { fprintf(stderr, "destruct Ae\n");
22 }
23 };
24 struct Be
25 {
~BeBe26 virtual ~Be()
27 { fprintf(stderr, "destruct Be\n");
28 }
29 };
30 struct Ce : public Ae, public Be
31 {
~CeCe32 virtual ~Ce()
33 { fprintf(stderr, "destruct Ce\n");
34 }
35 };
36
37 struct A
38 {
39 char a;
AA40 A()
41 { a = 'a';
42 }
~AA43 virtual ~A()
44 { fprintf(stderr, "destruct A\n");
45 }
46 };
47 struct B
48 {
49 char b;
BB50 B()
51 { b = 'b';
52 }
~BB53 virtual ~B()
54 { fprintf(stderr, "destruct B\n");
55 }
56 };
57 struct C : public A, public B
58 {
59 char c;
CC60 C()
61 { c = 'c';
62 }
~CC63 virtual ~C()
64 { fprintf(stderr, "destruct C\n");
65 }
66 };
67
68 std::string str;
69 std::string str2;
70 MyClass *ptr;
71 MyClass *ptr2;
72 Be *ptrBCe;
73 Ae *ptrACe;
74 B *ptrBC;
75 A *ptrAC;
76
77 char who_points_at_cmd[100];
78
doit(void)79 void doit(void)
80 {
81 str = "Valgrind"; // interior ptr.
82 str2 = str;
83 ptr = new MyClass[3]; // interior ptr.
84
85 // prepare the who_points_at cmd we will run.
86 // Do it here to avoid having ptr or its exterior ptr kept in a register.
87 sprintf(who_points_at_cmd, "who_points_at %p 20", (char*)ptr - sizeof(void*));
88
89 ptr2 = new MyClass[0]; // "interior but exterior ptr".
90 // ptr2 points after the chunk, is wrongly considered by memcheck as definitely leaked.
91
92 ptrBCe = new Ce; // interior ptr.
93 ptrACe = new Ce; // not an interior pointer.
94 ptrBC = new C; // interior ptr.
95 ptrAC = new C; // not an interior pointer.
96
97
98 str2 += " rocks (str2)\n"; // interior ptr.
99 }
100
101
main()102 int main() {
103
104 doit();
105 (void) VALGRIND_MONITOR_COMMAND("v.set log_output");
106
107 fprintf(stderr, "VALGRIND_DO_LEAK_CHECK\n");
108 VALGRIND_DO_LEAK_CHECK; // All possible leaks should be detected, giving only reachable data.
109
110 // Check individually each heuristic
111 fprintf(stderr, "leak_check summary heuristics multipleinheritance\n");
112 (void) VALGRIND_MONITOR_COMMAND("leak_check summary heuristics multipleinheritance");
113 fprintf(stderr, "leak_check summary any heuristics newarray\n");
114 (void) VALGRIND_MONITOR_COMMAND("leak_check summary heuristics newarray");
115 fprintf(stderr, "leak_check summary heuristics stdstring\n");
116 (void) VALGRIND_MONITOR_COMMAND("leak_check summary heuristics stdstring");
117
118 // Test the who_points_at when the block is pointed to with an interior ptr.
119 (void) VALGRIND_MONITOR_COMMAND(who_points_at_cmd);
120
121 delete [] ptr;
122 delete [] ptr2;
123 delete ptrBCe;
124 delete ptrACe;
125 delete ptrBC;
126 delete ptrAC;
127 fprintf(stderr, "Finished!\n");
128 return 0;
129 }
130
131