Skip to content

Commit 28b309a

Browse files
committed
Insert valgrind checks
1 parent 43ae6dc commit 28b309a

File tree

7 files changed

+301
-53
lines changed

7 files changed

+301
-53
lines changed

broken.c

+228-35
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include "memcheck.h"
12
#include "runtime.h"
23

34
enum OptT0_kind { SomeT0_tag, NoneT0_tag };
@@ -19,7 +20,11 @@ struct T0 {
1920
int addedPCR;
2021
enum T0_kind kind;
2122
void (*print)();
23+
struct OptT0* f1;
24+
struct OptT0* f3;
2225
struct OptT0* f0;
26+
struct OptT0* f4;
27+
struct OptT0* f2;
2328
union {
2429
struct { };
2530
};
@@ -40,7 +45,7 @@ void $print_OptT0(struct OptT0* this);
4045
void $print_T0(struct T0* this);
4146
struct OptT0* new$SomeT0(struct T0* value);
4247
struct OptT0* new$NoneT0();
43-
struct T0* new$T0(struct OptT0* f0);
48+
struct T0* new$T0(struct OptT0* f0, struct OptT0* f1, struct OptT0* f2, struct OptT0* f3, struct OptT0* f4);
4449
int main();
4550
void $free_OptT0(struct OptT0* this) {
4651
fprintf(stderr, "Freeing OptT0\n");
@@ -86,7 +91,11 @@ void $decr_T0(struct T0* this) {
8691
if (--this->rc == 0) {
8792
switch (this->kind) {
8893
case T0_tag:
94+
$decr_OptT0(this->f1);
95+
$decr_OptT0(this->f3);
8996
$decr_OptT0(this->f0);
97+
$decr_OptT0(this->f4);
98+
$decr_OptT0(this->f2);
9099
break;
91100
}
92101
removePCR((void *) this, 0);
@@ -117,8 +126,16 @@ void $markGray_T0(struct T0* this) {
117126
this->color = kGray;
118127
switch (this->kind) {
119128
case T0_tag:
129+
this->f1->rc --;
130+
$markGray_OptT0(this->f1);
131+
this->f3->rc --;
132+
$markGray_OptT0(this->f3);
120133
this->f0->rc --;
121134
$markGray_OptT0(this->f0);
135+
this->f4->rc --;
136+
$markGray_OptT0(this->f4);
137+
this->f2->rc --;
138+
$markGray_OptT0(this->f2);
122139
break;
123140
}
124141
}
@@ -146,7 +163,11 @@ void $scan_T0(struct T0* this) {
146163
this->color = kWhite;
147164
switch (this->kind) {
148165
case T0_tag:
166+
$scan_OptT0(this->f1);
167+
$scan_OptT0(this->f3);
149168
$scan_OptT0(this->f0);
169+
$scan_OptT0(this->f4);
170+
$scan_OptT0(this->f2);
150171
break;
151172
}
152173
}
@@ -168,8 +189,16 @@ void $scanBlack_T0(struct T0* this) {
168189
this->color = kBlack;
169190
switch (this->kind) {
170191
case T0_tag:
192+
this->f1->rc ++;
193+
$scanBlack_OptT0(this->f1);
194+
this->f3->rc ++;
195+
$scanBlack_OptT0(this->f3);
171196
this->f0->rc ++;
172197
$scanBlack_OptT0(this->f0);
198+
this->f4->rc ++;
199+
$scanBlack_OptT0(this->f4);
200+
this->f2->rc ++;
201+
$scanBlack_OptT0(this->f2);
173202
break;
174203
}
175204
}
@@ -197,7 +226,11 @@ void $collectWhite_T0(struct T0* this) {
197226
this->color = kBlack;
198227
switch (this->kind) {
199228
case T0_tag:
229+
$collectWhite_OptT0(this->f1);
230+
$collectWhite_OptT0(this->f3);
200231
$collectWhite_OptT0(this->f0);
232+
$collectWhite_OptT0(this->f4);
233+
$collectWhite_OptT0(this->f2);
201234
break;
202235
}
203236
fprintf(stderr, "Removing T0\n");
@@ -227,9 +260,21 @@ void $print_T0(struct T0* this) {
227260
switch (this->kind) {
228261
case T0_tag:
229262
printf("T0 {");
263+
printf("f1=");
264+
$print_OptT0(this->f1);
265+
printf(", ");
266+
printf("f3=");
267+
$print_OptT0(this->f3);
268+
printf(", ");
230269
printf("f0=");
231270
$print_OptT0(this->f0);
232271
printf(", ");
272+
printf("f4=");
273+
$print_OptT0(this->f4);
274+
printf(", ");
275+
printf("f2=");
276+
$print_OptT0(this->f2);
277+
printf(", ");
233278
printf("}");
234279
break;
235280
}
@@ -254,55 +299,203 @@ struct OptT0* new$NoneT0() {
254299
$res->kind = NoneT0_tag;
255300
return $res;
256301
}
257-
struct T0* new$T0(struct OptT0* f0) {
302+
struct T0* new$T0(struct OptT0* f0, struct OptT0* f1, struct OptT0* f2, struct OptT0* f3, struct OptT0* f4) {
258303
struct T0* $res = malloc(sizeof (struct T0));
259304
$res->rc = 0;
260305
$res->color = kBlack;
261306
$res->addedPCR = 0;
262307
$res->print = $print_T0;
263308
$res->kind = T0_tag;
309+
$res->f1 = f1;
310+
$res->f1->rc ++;
311+
$res->f3 = f3;
312+
$res->f3->rc ++;
264313
$res->f0 = f0;
265314
$res->f0->rc ++;
315+
$res->f4 = f4;
316+
$res->f4->rc ++;
317+
$res->f2 = f2;
318+
$res->f2->rc ++;
266319
return $res;
267320
}
268321
int main() {
269-
struct T0* vT0_0 = new$T0(new$NoneT0());
270-
vT0_0->rc ++;
271-
struct T0* vT0_2 = new$T0(new$NoneT0());
272-
vT0_2->rc ++;
273-
struct T0* vT0_1 = new$T0(new$NoneT0());
274-
vT0_1->rc ++;
275-
struct T0* vT0_6 = new$T0(new$NoneT0());
276-
vT0_6->rc ++;
277-
struct T0* vT0_5 = new$T0(new$NoneT0());
322+
struct T0* vT0_5 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
278323
vT0_5->rc ++;
279-
struct T0* vT0_3 = new$T0(new$NoneT0());
280-
vT0_3->rc ++;
281-
struct T0* vT0_4 = new$T0(new$NoneT0());
324+
struct T0* vT0_12 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
325+
vT0_12->rc ++;
326+
struct T0* vT0_11 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
327+
vT0_11->rc ++;
328+
struct T0* vT0_0 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
329+
vT0_0->rc ++;
330+
struct T0* vT0_4 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
282331
vT0_4->rc ++;
283-
struct OptT0* oldValue$0 = vT0_5->f0;
284-
vT0_5->f0 = new$SomeT0(vT0_6);
285-
vT0_5->f0->rc ++;
332+
struct T0* vT0_3 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
333+
vT0_3->rc ++;
334+
struct T0* vT0_7 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
335+
vT0_7->rc ++;
336+
struct T0* vT0_9 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
337+
vT0_9->rc ++;
338+
struct T0* vT0_6 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
339+
vT0_6->rc ++;
340+
struct T0* vT0_10 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
341+
vT0_10->rc ++;
342+
struct T0* vT0_8 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
343+
vT0_8->rc ++;
344+
struct T0* vT0_1 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
345+
vT0_1->rc ++;
346+
struct T0* vT0_2 = new$T0(new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0(), new$NoneT0());
347+
vT0_2->rc ++;
348+
struct OptT0* oldValue$0 = vT0_1->f1;
349+
vT0_1->f1 = new$SomeT0(vT0_8);
350+
vT0_1->f1->rc ++;
286351
$decr_OptT0(oldValue$0);
287-
struct OptT0* oldValue$1 = vT0_0->f0;
288-
vT0_0->f0 = new$SomeT0(vT0_0);
289-
vT0_0->f0->rc ++;
352+
struct OptT0* oldValue$1 = vT0_12->f2;
353+
vT0_12->f2 = new$SomeT0(vT0_12);
354+
vT0_12->f2->rc ++;
290355
$decr_OptT0(oldValue$1);
291-
struct OptT0* oldValue$2 = vT0_3->f0;
292-
vT0_3->f0 = new$SomeT0(vT0_5);
293-
vT0_3->f0->rc ++;
356+
struct OptT0* oldValue$2 = vT0_11->f2;
357+
vT0_11->f2 = new$SomeT0(vT0_3);
358+
vT0_11->f2->rc ++;
294359
$decr_OptT0(oldValue$2);
295-
vT0_3->f0;
296-
vT0_0->f0;
297-
vT0_5->f0;
298-
int ret$3 = 0;
299-
$decr_T0(vT0_4);
300-
$decr_T0(vT0_3);
301-
$decr_T0(vT0_5);
302-
$decr_T0(vT0_6);
303-
$decr_T0(vT0_1);
304-
$decr_T0(vT0_2);
305-
$decr_T0(vT0_0);
360+
struct OptT0* oldValue$3 = vT0_5->f0;
361+
vT0_5->f0 = new$SomeT0(vT0_8);
362+
vT0_5->f0->rc ++;
363+
$decr_OptT0(oldValue$3);
364+
struct OptT0* oldValue$4 = vT0_6->f0;
365+
vT0_6->f0 = new$SomeT0(vT0_8);
366+
vT0_6->f0->rc ++;
367+
$decr_OptT0(oldValue$4);
368+
struct OptT0* oldValue$5 = vT0_9->f2;
369+
vT0_9->f2 = new$SomeT0(vT0_9);
370+
vT0_9->f2->rc ++;
371+
$decr_OptT0(oldValue$5);
372+
struct OptT0* oldValue$6 = vT0_6->f2;
373+
vT0_6->f2 = new$SomeT0(vT0_8);
374+
vT0_6->f2->rc ++;
375+
$decr_OptT0(oldValue$6);
376+
struct OptT0* oldValue$7 = vT0_2->f2;
377+
vT0_2->f2 = new$SomeT0(vT0_0);
378+
vT0_2->f2->rc ++;
379+
$decr_OptT0(oldValue$7);
380+
struct OptT0* oldValue$8 = vT0_0->f1;
381+
vT0_0->f1 = new$SomeT0(vT0_7);
382+
vT0_0->f1->rc ++;
383+
$decr_OptT0(oldValue$8);
384+
struct OptT0* oldValue$9 = vT0_7->f2;
385+
vT0_7->f2 = new$SomeT0(vT0_5);
386+
vT0_7->f2->rc ++;
387+
$decr_OptT0(oldValue$9);
388+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
389+
struct OptT0* oldValue$10 = vT0_8->f1;
390+
vT0_8->f1 = new$SomeT0(vT0_2);
391+
vT0_8->f1->rc ++;
392+
$decr_OptT0(oldValue$10);
393+
struct OptT0* oldValue$11 = vT0_4->f2;
394+
vT0_4->f2 = new$SomeT0(vT0_5);
395+
vT0_4->f2->rc ++;
396+
$decr_OptT0(oldValue$11);
397+
struct OptT0* oldValue$12 = vT0_10->f1;
398+
vT0_10->f1 = new$SomeT0(vT0_11);
399+
vT0_10->f1->rc ++;
400+
$decr_OptT0(oldValue$12);
401+
struct OptT0* oldValue$13 = vT0_12->f1;
402+
vT0_12->f1 = new$SomeT0(vT0_0);
403+
vT0_12->f1->rc ++;
404+
$decr_OptT0(oldValue$13);
405+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
406+
struct OptT0* oldValue$14 = vT0_1->f2;
407+
vT0_1->f2 = new$SomeT0(vT0_10);
408+
vT0_1->f2->rc ++;
409+
$decr_OptT0(oldValue$14);
410+
struct OptT0* oldValue$15 = vT0_4->f1;
411+
vT0_4->f1 = new$SomeT0(vT0_6);
412+
vT0_4->f1->rc ++;
413+
$decr_OptT0(oldValue$15);
414+
struct OptT0* oldValue$16 = vT0_10->f2;
415+
vT0_10->f2 = new$SomeT0(vT0_5);
416+
vT0_10->f2->rc ++;
417+
$decr_OptT0(oldValue$16);
418+
struct OptT0* oldValue$17 = vT0_2->f1;
419+
vT0_2->f1 = new$SomeT0(vT0_12);
420+
vT0_2->f1->rc ++;
421+
$decr_OptT0(oldValue$17);
422+
struct OptT0* oldValue$18 = vT0_12->f0;
423+
vT0_12->f0 = new$SomeT0(vT0_11);
424+
vT0_12->f0->rc ++;
425+
$decr_OptT0(oldValue$18);
426+
struct OptT0* oldValue$19 = vT0_2->f4;
427+
vT0_2->f4 = new$SomeT0(vT0_1);
428+
vT0_2->f4->rc ++;
429+
$decr_OptT0(oldValue$19);
430+
; $decr_T0(vT0_1);
431+
struct OptT0* oldValue$20 = vT0_5->f1;
432+
vT0_5->f1 = new$SomeT0(vT0_7);
433+
vT0_5->f1->rc ++;
434+
$decr_OptT0(oldValue$20);
435+
; $decr_T0(vT0_7);
436+
struct OptT0* oldValue$21 = vT0_0->f4;
437+
vT0_0->f4 = new$SomeT0(vT0_2);
438+
vT0_0->f4->rc ++;
439+
$decr_OptT0(oldValue$21);
440+
struct OptT0* oldValue$22 = vT0_3->f4;
441+
vT0_3->f4 = new$SomeT0(vT0_12);
442+
vT0_3->f4->rc ++;
443+
$decr_OptT0(oldValue$22);
444+
struct OptT0* oldValue$23 = vT0_4->f3;
445+
vT0_4->f3 = new$SomeT0(vT0_12);
446+
vT0_4->f3->rc ++;
447+
$decr_OptT0(oldValue$23);
448+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
449+
struct OptT0* oldValue$24 = vT0_12->f4;
450+
vT0_12->f4 = new$SomeT0(vT0_5);
451+
vT0_12->f4->rc ++;
452+
$decr_OptT0(oldValue$24);
453+
; $decr_T0(vT0_12);
454+
struct OptT0* oldValue$25 = vT0_9->f1;
455+
vT0_9->f1 = new$SomeT0(vT0_11);
456+
vT0_9->f1->rc ++;
457+
$decr_OptT0(oldValue$25);
458+
; $decr_T0(vT0_9);
459+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
460+
; $decr_T0(vT0_11);
461+
struct OptT0* oldValue$26 = vT0_5->f2;
462+
vT0_5->f2 = new$SomeT0(vT0_4);
463+
vT0_5->f2->rc ++;
464+
$decr_OptT0(oldValue$26);
465+
; $decr_T0(vT0_5);
466+
struct OptT0* oldValue$27 = vT0_4->f4;
467+
vT0_4->f4 = new$SomeT0(vT0_6);
468+
vT0_4->f4->rc ++;
469+
$decr_OptT0(oldValue$27);
470+
; $decr_T0(vT0_4);
471+
; $decr_T0(vT0_6);
472+
struct OptT0* oldValue$28 = vT0_3->f1;
473+
vT0_3->f1 = new$SomeT0(vT0_10);
474+
vT0_3->f1->rc ++;
475+
$decr_OptT0(oldValue$28);
476+
; $decr_T0(vT0_10);
477+
struct OptT0* oldValue$29 = vT0_8->f2;
478+
vT0_8->f2 = new$SomeT0(vT0_8);
479+
vT0_8->f2->rc ++;
480+
$decr_OptT0(oldValue$29);
481+
; $decr_T0(vT0_8);
482+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
483+
; $decr_T0(vT0_8);
484+
struct OptT0* oldValue$30 = vT0_0->f2;
485+
vT0_0->f2 = new$SomeT0(vT0_2);
486+
vT0_0->f2->rc ++;
487+
$decr_OptT0(oldValue$30);
488+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
489+
; $decr_T0(vT0_0);
490+
; $decr_T0(vT0_2);
491+
struct OptT0* oldValue$31 = vT0_3->f2;
492+
vT0_3->f2 = new$SomeT0(vT0_3);
493+
vT0_3->f2->rc ++;
494+
$decr_OptT0(oldValue$31);
495+
; $decr_T0(vT0_3);
496+
processAllPCRs(); VALGRIND_DO_LEAK_CHECK;
497+
; $decr_T0(vT0_3);
498+
int ret$32 = 0;
306499
processAllPCRs();
307-
return ret$3;
500+
return ret$32;
308501
}

src/main/scala/fred/Translator.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,9 @@ object Translator {
513513
case td: TypeDef if !lhs.isInstanceOf[SetFieldExpr] =>
514514
s"drop((void *) $lhsTranslated, (void *) ${Decrementer.name(td)});"
515515
case _ => lhs match {
516-
case _: SetFieldExpr => ""
517-
case _ => s"$lhsTranslated;"
516+
case _: SetFieldExpr => ""
517+
case call: FnCall if call.fnName.value == "c" => ""
518+
case _ => s"$lhsTranslated;"
518519
}
519520
}
520521
(s"$setup\n$execLhs", rhsTranslated, teardown)

src/test/resources/snapshot/exec/basic-cycle.c

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/test/resources/snapshot/exec/contrived-needs-sorting.c

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/test/resources/snapshot/gen/set-field-sfdu29.c

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)