https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88054

            Bug ID: 88054
           Summary: Sanitizer triggers on valid code
           Product: gcc
           Version: 8.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tydeman at tybor dot com
  Target Milestone: ---

This code gets "caught" at runtime, but I believe that the code is valid.
This is on Intel i5, 32-bit Fedora 29, gcc 8.2.1.

command line flags are: "-fsanitize=undefined -fsanitize=address
-fsanitize=bounds-strict -fstack-protector-all -H -std=gnu17 -O0 -march=native
-mfpmath=387 -mieee-fp -fno-builtin -frounding-math -ffloat-store
-fexcess-precision=standard -fsignaling-nans"

#include <stdio.h>
#include <wchar.h>      /* wchar_t, wcsto*(), swprintf(), swscanf()     */
#include <stddef.h>

static FILE *file = NULL;       /* points to FILE returned by open() */
static char *filename = NULL;   /* points to name of temp file */

typedef struct {
  float str_fpval;              /* FP value returned by wcsto*, and maybe
*wscanf */
  ptrdiff_t str_numread;        /* number of characters accepted by wcsto* */
  int wscan_cnt;                /* # of chars processed by %f */
  int wscan_rc;                 /* return code from wscanf */
  const wchar_t from[20];       /* string to process by *wscanf and wcsto* */
  const wchar_t wscan_str[20-8];        /* string return by wscanf's %ls; this
or next time */
} data;

static data tv[] = {
/*  0*/{ 100.f, (ptrdiff_t)3, 3, 1, L"100", L"" }
  };

int main(void){
  int rc;
  int i = 0;
  { (void)printf("DEBUG 1\n"); fflush(NULL); }
  filename = tmpnam(NULL);      /* create a temporary file */
  { (void)printf("DEBUG 2\n"); fflush(NULL); }
  (void)printf("temp file name=%s\n", filename);
  { (void)printf("DEBUG 3\n"); fflush(NULL); }
  file = fopen(filename,"wb");  /* make sure we can open the file */
  { (void)printf("DEBUG 4\n"); fflush(NULL); }
  file = freopen(NULL, "wb", file);     /* so can write */
  { (void)printf("DEBUG 5\n"); fflush(NULL); }
  { (void)printf("str=%ls\n", tv[i].from); fflush(NULL); }
  { (void)printf("DEBUG 6\n"); fflush(NULL); }
  { (void)printf("file=%p\n", file); fflush(NULL); }
  { (void)printf("DEBUG 7\n"); fflush(NULL); }
  rc = fwprintf( file, L"%ls", tv[i].from ); /* string to process */
  { (void)printf("DEBUG 8\n"); fflush(NULL); }
  return 0;
}

Reply via email to