1eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
2eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Check some aspects of the use of the
3eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE and
4eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE macros. */
5eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
6eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include <stdio.h>
7eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include <stdlib.h>
8eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
9eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "../memcheck.h"
10eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
11eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovint main ( void )
12eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
13eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  volatile int* volatile mem
14eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov     = (volatile int* volatile)malloc(1000 * sizeof(int));
15eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  free((void*)mem);
16eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
17eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Check that we get an invalid access complaint
18eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  fprintf(stderr, "\nDoing invalid access.  Expect complaint.\n\n");
19eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  mem[123] = 0;
20eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
21eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Now disable error reporting in the range
22eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  fprintf(stderr, "\nDisabling address error reporting for the range.\n\n");
23eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(mem, 1000 * sizeof(int));
24eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
25eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Check that we get an invalid access complaint
26eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  fprintf(stderr, "\nDoing invalid another access.  Expect no complaint.\n\n");
27eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  mem[456] = 0;
28eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
29eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Re-enable reporting on the first byte of one word from the ignore range
30eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  fprintf(stderr, "\nPartially reenabling address error reporting.\n\n");
31eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(&mem[789], 1);
32eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
33eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Check that we get an invalid access complaint
34eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  fprintf(stderr, "\nDoing a third access.  Expect complaint.\n\n");
35eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  mem[789] = 0;
36eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
37eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // And now quit and expect to see a warning about two remaining ranges
38eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  fprintf(stderr, "\nExiting.  Expect warnings of 2 remaining ranges.\n\n");
39eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
40eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  return 0;
41eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
42