1
2/* Test simple use of the disable/enable macros. */
3
4#include <stdlib.h>
5#include <stdio.h>
6
7#include "../include/valgrind.h"
8
9char* block = NULL;
10
11__attribute__((noinline)) void usechar ( char c )
12{
13   // Spook gcc into believing mysterious bad things are
14   // happening behind its back, and that 'c' is definitely
15   // used in some (unknown) way.
16   __asm__ __volatile__("" : : "r"(c) : "memory","cc");
17}
18
19__attribute__((noinline)) void err ( void )
20{
21   usechar( block[5] );
22}
23
24int main ( void )
25{
26  block = malloc(10);
27  free(block);
28
29  fprintf(stderr, "\n--------- SIMPLE TEST ---------\n\n");
30  fprintf(stderr, "\n--------- enabled (expect 1) ---------\n\n");
31
32  err();
33
34  fprintf(stderr, "\n--------- disabled (expect 0) ---------\n\n");
35  VALGRIND_DISABLE_ERROR_REPORTING;
36
37  err();
38
39  fprintf(stderr, "\n--------- re-enabled (expect 1) ---------\n\n");
40  VALGRIND_ENABLE_ERROR_REPORTING;
41
42  err();
43
44
45
46  fprintf(stderr, "\n--------- MULTI-LEVEL TEST (expect 2) ---------\n\n");
47
48  // 4 times
49  VALGRIND_DISABLE_ERROR_REPORTING;
50  VALGRIND_DISABLE_ERROR_REPORTING;
51  VALGRIND_DISABLE_ERROR_REPORTING;
52  VALGRIND_DISABLE_ERROR_REPORTING; // lev = 4
53
54  // now gradually undo them until an error appears
55  err();  // hidden
56
57  VALGRIND_ENABLE_ERROR_REPORTING; // lev = 3
58  err();  // hidden
59
60  VALGRIND_ENABLE_ERROR_REPORTING; // lev = 2
61  err();  // hidden
62
63  VALGRIND_ENABLE_ERROR_REPORTING; // lev = 1
64  err();  // hidden
65
66  VALGRIND_ENABLE_ERROR_REPORTING; // lev = 0
67  err();  // visible
68
69  VALGRIND_ENABLE_ERROR_REPORTING; // lev = 0 (won't go down further)
70  err();  // visible
71
72  fprintf(stderr, "\n--------- MULTI-LEVEL TEST end ---------\n\n");
73
74  return 0;
75}
76