/* Test reporting of out-of-bounds access for dynamic arrays.
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include "tst-dynarray-shared.h"

#include <signal.h>
#include <stdint.h>
#include <string.h>
#include <support/capture_subprocess.h>
#include <support/check.h>

/* Run CALLBACK and check that the data on standard error equals
   EXPECTED.  */
static void
check (const char *test, void (*callback) (void *), size_t index,
       const char *expected)
{
  struct support_capture_subprocess result
    = support_capture_subprocess (callback, &index);
  if (strcmp (result.err.buffer, expected) != 0)
    {
      support_record_failure ();
      printf ("error: test %s (%zu) unexpected standard error data\n"
              "  expected: %s\n"
              "  actual:   %s\n",
              test, index, expected, result.err.buffer);
    }
  TEST_VERIFY (strlen (result.out.buffer) == 0);
  TEST_VERIFY (WIFSIGNALED (result.status));
  if (WIFSIGNALED (result.status))
    TEST_VERIFY (WTERMSIG (result.status) == SIGABRT);
  support_capture_subprocess_free (&result);
}

/* Try indexing an empty array.  */
static void
test_empty (void *closure)
{
  size_t *pindex = closure;
  struct dynarray_int dyn;
  dynarray_int_init (&dyn);
  dynarray_int_at (&dyn, *pindex);
}

/* Try indexing a one-element array.  */
static void
test_one (void *closure)
{
  size_t *pindex = closure;
  struct dynarray_int dyn;
  dynarray_int_init (&dyn);
  TEST_VERIFY (dynarray_int_resize (&dyn, 1));
  dynarray_int_at (&dyn, *pindex);
}

/* Try indexing a longer array.  */
static void
test_many (void *closure)
{
  size_t *pindex = closure;
  struct dynarray_int dyn;
  dynarray_int_init (&dyn);
  TEST_VERIFY (dynarray_int_resize (&dyn, 5371));
  dynarray_int_at (&dyn, *pindex);
}

/* (size_t) -1 for use in string literals.  */
#if SIZE_WIDTH == 32
# define MINUS_1 "4294967295"
#elif SIZE_WIDTH == 64
# define MINUS_1 "18446744073709551615"
#else
# error "unknown value for SIZE_WIDTH"
#endif

static int
do_test (void)
{
  TEST_VERIFY (setenv ("LIBC_FATAL_STDERR_", "1", 1) == 0);

  check ("test_empty", test_empty, 0,
         "Fatal glibc error: array index 0 not less than array length 0\n");
  check ("test_empty", test_empty, 1,
         "Fatal glibc error: array index 1 not less than array length 0\n");
  check ("test_empty", test_empty, -1,
         "Fatal glibc error: array index " MINUS_1
         " not less than array length 0\n");

  check ("test_one", test_one, 1,
         "Fatal glibc error: array index 1 not less than array length 1\n");
  check ("test_one", test_one, 2,
         "Fatal glibc error: array index 2 not less than array length 1\n");
  check ("test_one", test_one, -1,
         "Fatal glibc error: array index " MINUS_1
         " not less than array length 1\n");

  check ("test_many", test_many, 5371,
         "Fatal glibc error: array index 5371"
         " not less than array length 5371\n");
  check ("test_many", test_many, 5372,
         "Fatal glibc error: array index 5372"
         " not less than array length 5371\n");
  check ("test_many", test_many, -1,
         "Fatal glibc error: array index " MINUS_1
         " not less than array length 5371\n");

  return 0;
}

#include <support/test-driver.c>
