Blame stdio-common/tstdiomisc.c

Packit Service 82fcde
#include <array_length.h>
Packit Service 82fcde
#include <float.h>
Packit Service 82fcde
#include <math.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <wchar.h>
Packit Service 82fcde
#include <libc-diag.h>
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
t1 (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int n = -1;
Packit Service 82fcde
  sscanf ("abc  ", "abc %n", &n);
Packit Service 82fcde
  printf ("t1: count=%d\n", n);
Packit Service 82fcde
Packit Service 82fcde
  return n != 5;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
t2 (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
  int n;
Packit Service 82fcde
  long N;
Packit Service 82fcde
  int retval;
Packit Service 82fcde
#define SCAN(INPUT, FORMAT, VAR, EXP_RES, EXP_VAL) \
Packit Service 82fcde
  VAR = -1; \
Packit Service 82fcde
  retval = sscanf (INPUT, FORMAT, &VAR); \
Packit Service 82fcde
  printf ("sscanf (\"%s\", \"%s\", &x) => %d, x = %ld\n", \
Packit Service 82fcde
	  INPUT, FORMAT, retval, (long int) VAR); \
Packit Service 82fcde
  result |= retval != EXP_RES || VAR != EXP_VAL
Packit Service 82fcde
Packit Service 82fcde
  /* This function is testing corner cases of the scanf format string,
Packit Service 82fcde
     so they do not all conform to -Wformat's expectations.  */
Packit Service 82fcde
  DIAG_PUSH_NEEDS_COMMENT;
Packit Service 82fcde
  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat");
Packit Service 82fcde
  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args");
Packit Service 82fcde
Packit Service 82fcde
  SCAN ("12345", "%ld", N, 1, 12345);
Packit Service 82fcde
  SCAN ("12345", "%llllld", N, 0, -1);
Packit Service 82fcde
  SCAN ("12345", "%LLLLLd", N, 0, -1);
Packit Service 82fcde
  SCAN ("test ", "%*s%n",  n, 0, 4);
Packit Service 82fcde
  SCAN ("test ", "%2*s%n",  n, 0, -1);
Packit Service 82fcde
  SCAN ("12 ",   "%l2d",  n, 0, -1);
Packit Service 82fcde
  SCAN ("12 ",   "%2ld",  N, 1, 12);
Packit Service 82fcde
Packit Service 82fcde
  n = -1;
Packit Service 82fcde
  N = -1;
Packit Service 82fcde
  retval = sscanf ("1 1", "%d %Z", &n, &N);
Packit Service 82fcde
  printf ("sscanf (\"1 1\", \"%%d %%Z\", &n, &N) => %d, n = %d, N = %ld\n", \
Packit Service 82fcde
	  retval, n, N); \
Packit Service 82fcde
  result |= retval != 1 || n != 1 || N != -1;
Packit Service 82fcde
Packit Service 82fcde
  DIAG_POP_NEEDS_COMMENT;
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
t3 (void)
Packit Service 82fcde
{
Packit Service 82fcde
  char buf[80];
Packit Service 82fcde
  wchar_t wbuf[80];
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
  int retval;
Packit Service 82fcde
Packit Service 82fcde
  retval = sprintf (buf, "%p", (char *) NULL);
Packit Service 82fcde
  result |= retval != 5 || strcmp (buf, "(nil)") != 0;
Packit Service 82fcde
Packit Service 82fcde
  retval = swprintf (wbuf, array_length (wbuf), L"%p", (char *) NULL);
Packit Service 82fcde
  result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0;
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
volatile double qnanval;
Packit Service 82fcde
volatile long double lqnanval;
Packit Service 82fcde
/* A sNaN is only guaranteed to be representable in variables with static (or
Packit Service 82fcde
   thread-local) storage duration.  */
Packit Service 82fcde
static volatile double snanval = __builtin_nans ("");
Packit Service 82fcde
static volatile double msnanval = -__builtin_nans ("");
Packit Service 82fcde
static volatile long double lsnanval = __builtin_nansl ("");
Packit Service 82fcde
static volatile long double lmsnanval = -__builtin_nansl ("");
Packit Service 82fcde
volatile double infval;
Packit Service 82fcde
volatile long double linfval;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
F (void)
Packit Service 82fcde
{
Packit Service 82fcde
  char buf[80];
Packit Service 82fcde
  wchar_t wbuf[40];
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
Packit Service 82fcde
  qnanval = NAN;
Packit Service 82fcde
Packit Service 82fcde
  /* The %f and %F arguments are in fact constants, but GCC is
Packit Service 82fcde
     prevented from seeing this (volatile is used) so it cannot tell
Packit Service 82fcde
     that the output is not truncated.  */
Packit Service 82fcde
  DIAG_PUSH_NEEDS_COMMENT;
Packit Service 82fcde
#if __GNUC_PREREQ (7, 0)
Packit Service 82fcde
  DIAG_IGNORE_NEEDS_COMMENT (7.0, "-Wformat-truncation");
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    qnanval, qnanval, qnanval, qnanval,
Packit Service 82fcde
	    qnanval, qnanval, qnanval, qnanval);
Packit Service 82fcde
  result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    -qnanval, -qnanval, -qnanval, -qnanval,
Packit Service 82fcde
	    -qnanval, -qnanval, -qnanval, -qnanval);
Packit Service 82fcde
  result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
Packit Service 82fcde
	  buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    snanval, snanval, snanval, snanval,
Packit Service 82fcde
	    snanval, snanval, snanval, snanval);
Packit Service 82fcde
  result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    msnanval, msnanval, msnanval, msnanval,
Packit Service 82fcde
	    msnanval, msnanval, msnanval, msnanval);
Packit Service 82fcde
  result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
Packit Service 82fcde
	  buf);
Packit Service 82fcde
Packit Service 82fcde
  infval = DBL_MAX * DBL_MAX;
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    infval, infval, infval, infval, infval, infval, infval, infval);
Packit Service 82fcde
  result |= strcmp (buf, "inf INF inf INF inf INF inf INF") != 0;
Packit Service 82fcde
  printf ("expected \"inf INF inf INF inf INF inf INF\", got \"%s\"\n", buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    -infval, -infval, -infval, -infval,
Packit Service 82fcde
	    -infval, -infval, -infval, -infval);
Packit Service 82fcde
  result |= strcmp (buf, "-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
Packit Service 82fcde
  printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n",
Packit Service 82fcde
	  buf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf), L"%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    qnanval, qnanval, qnanval, qnanval,
Packit Service 82fcde
	    qnanval, qnanval, qnanval, qnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf), L"%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    -qnanval, -qnanval, -qnanval, -qnanval,
Packit Service 82fcde
	    -qnanval, -qnanval, -qnanval, -qnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
Packit Service 82fcde
	  wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf), L"%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    snanval, snanval, snanval, snanval,
Packit Service 82fcde
	    snanval, snanval, snanval, snanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf), L"%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    msnanval, msnanval, msnanval, msnanval,
Packit Service 82fcde
	    msnanval, msnanval, msnanval, msnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
Packit Service 82fcde
	  wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf), L"%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    infval, infval, infval, infval, infval, infval, infval, infval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0;
Packit Service 82fcde
  printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf), L"%a %A %e %E %f %F %g %G",
Packit Service 82fcde
	    -infval, -infval, -infval, -infval,
Packit Service 82fcde
	    -infval, -infval, -infval, -infval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
Packit Service 82fcde
  printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n",
Packit Service 82fcde
	  wbuf);
Packit Service 82fcde
Packit Service 82fcde
  lqnanval = NAN;
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    lqnanval, lqnanval, lqnanval, lqnanval,
Packit Service 82fcde
	    lqnanval, lqnanval, lqnanval, lqnanval);
Packit Service 82fcde
  result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    -lqnanval, -lqnanval, -lqnanval, -lqnanval,
Packit Service 82fcde
	    -lqnanval, -lqnanval, -lqnanval, -lqnanval);
Packit Service 82fcde
  result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
Packit Service 82fcde
	  buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    lsnanval, lsnanval, lsnanval, lsnanval,
Packit Service 82fcde
	    lsnanval, lsnanval, lsnanval, lsnanval);
Packit Service 82fcde
  result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    lmsnanval, lmsnanval, lmsnanval, lmsnanval,
Packit Service 82fcde
	    lmsnanval, lmsnanval, lmsnanval, lmsnanval);
Packit Service 82fcde
  result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
Packit Service 82fcde
	  buf);
Packit Service 82fcde
Packit Service 82fcde
  linfval = LDBL_MAX * LDBL_MAX;
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    linfval, linfval, linfval, linfval,
Packit Service 82fcde
	    linfval, linfval, linfval, linfval);
Packit Service 82fcde
  result |= strcmp (buf, "inf INF inf INF inf INF inf INF") != 0;
Packit Service 82fcde
  printf ("expected \"inf INF inf INF inf INF inf INF\", got \"%s\"\n", buf);
Packit Service 82fcde
Packit Service 82fcde
  snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    -linfval, -linfval, -linfval, -linfval,
Packit Service 82fcde
	    -linfval, -linfval, -linfval, -linfval);
Packit Service 82fcde
  result |= strcmp (buf, "-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
Packit Service 82fcde
  printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n",
Packit Service 82fcde
	  buf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf),
Packit Service 82fcde
	    L"%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    lqnanval, lqnanval, lqnanval, lqnanval,
Packit Service 82fcde
	    lqnanval, lqnanval, lqnanval, lqnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf),
Packit Service 82fcde
	    L"%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    -lqnanval, -lqnanval, -lqnanval, -lqnanval,
Packit Service 82fcde
	    -lqnanval, -lqnanval, -lqnanval, -lqnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
Packit Service 82fcde
	  wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf),
Packit Service 82fcde
	    L"%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    lsnanval, lsnanval, lsnanval, lsnanval,
Packit Service 82fcde
	    lsnanval, lsnanval, lsnanval, lsnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf),
Packit Service 82fcde
	    L"%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    lmsnanval, lmsnanval, lmsnanval, lmsnanval,
Packit Service 82fcde
	    lmsnanval, lmsnanval, lmsnanval, lmsnanval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
Packit Service 82fcde
  printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
Packit Service 82fcde
	  wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf),
Packit Service 82fcde
	    L"%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    linfval, linfval, linfval, linfval,
Packit Service 82fcde
	    linfval, linfval, linfval, linfval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0;
Packit Service 82fcde
  printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf);
Packit Service 82fcde
Packit Service 82fcde
  swprintf (wbuf, array_length (wbuf),
Packit Service 82fcde
	    L"%La %LA %Le %LE %Lf %LF %Lg %LG",
Packit Service 82fcde
	    -linfval, -linfval, -linfval, -linfval,
Packit Service 82fcde
	    -linfval, -linfval, -linfval, -linfval);
Packit Service 82fcde
  result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0;
Packit Service 82fcde
  printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n",
Packit Service 82fcde
	  wbuf);
Packit Service 82fcde
Packit Service 82fcde
  DIAG_POP_NEEDS_COMMENT;
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int
Packit Service 82fcde
main (int argc, char *argv[])
Packit Service 82fcde
{
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
Packit Service 82fcde
  result |= t1 ();
Packit Service 82fcde
  result |= t2 ();
Packit Service 82fcde
  result |= t3 ();
Packit Service 82fcde
  result |= F ();
Packit Service 82fcde
Packit Service 82fcde
  result |= fflush (stdout) == EOF;
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}