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