1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Test that we get a complaint if a thread exits with error reporting
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   disabled.  */
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdlib.h>
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include "../include/valgrind.h"
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovchar* block = NULL;
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov__attribute__((noinline)) void usechar ( char c )
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // Spook gcc into believing mysterious bad things are
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // happening behind its back, and that 'c' is definitely
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   // used in some (unknown) way.
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   __asm__ __volatile__("" : : "r"(c) : "memory","cc");
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov__attribute__((noinline)) void err ( void )
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   usechar( block[5] );
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main ( void )
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  block = malloc(10);
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  free(block);
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
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--------- exiting (expect complaint) ---------\n\n");
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  return 0;
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
43