/* Check some aspects of the use of the 
   VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE and
   VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE macros. */

#include <stdio.h>
#include <stdlib.h>

#include "../memcheck.h"

int main ( void )
{
  volatile int* volatile mem
     = (volatile int* volatile)malloc(1000 * sizeof(int));
  free((void*)mem);

  // Check that we get an invalid access complaint
  fprintf(stderr, "\nDoing invalid access.  Expect complaint.\n\n");
  mem[123] = 0;

  // Now disable error reporting in the range
  fprintf(stderr, "\nDisabling address error reporting for the range.\n\n");
  VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(mem, 1000 * sizeof(int));

  // Check that we get an invalid access complaint
  fprintf(stderr, "\nDoing invalid another access.  Expect no complaint.\n\n");
  mem[456] = 0;
 
  // Re-enable reporting on the first byte of one word from the ignore range
  fprintf(stderr, "\nPartially reenabling address error reporting.\n\n");
  VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(&mem[789], 1);

  // Check that we get an invalid access complaint
  fprintf(stderr, "\nDoing a third access.  Expect complaint.\n\n");
  mem[789] = 0;

  // And now quit and expect to see a warning about two remaining ranges
  fprintf(stderr, "\nExiting.  Expect warnings of 2 remaining ranges.\n\n");

  return 0;
}