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 9 char* 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 24 int 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