/* BZ #25219 - improve out-of-bounds checking with GCC 10 attribute access */ #include #include #include #include /* */ int nowarn_fgets (FILE *f, int i) { char a[4]; if (i < 0) i = 0; return !!fgets (a + i, sizeof a, f); // nowarn } int warn_fgets (FILE *f, int i) { char a[4]; if (i < 1) i = 1; return !!fgets (a + i, sizeof a, f); // warn } int nowarn_fgets_unlocked (FILE *f, int i) { char a[4]; if (i < 0) i = 0; return !!fgets_unlocked (a + i, sizeof a, f); // nowarn } int warn_fgets_unlocked (FILE *f, int i) { char a[4]; if (i < 1) i = 1; return !!fgets_unlocked (a + i, sizeof a, f); // warn } int nowarn_sprintf (int i) { char a[4]; if (i < 0) i = 0; return sprintf (a + i, "123"); // nowarn } int warn_sprintf (int i) { char a[4]; if (i < 1) i = 1; return sprintf (a + i, "123"); // warn } int nowarn_snprintf (int i) { char a[4]; if (i < 0) i = 0; return snprintf (a + i, sizeof a, "123"); // nowarn } int warn_snprintf (int i) { char a[4]; if (i < 1) i = 1; return snprintf (a + i, sizeof a, "123"); // warn } int nowarn_vsprintf (va_list va, int i) { char a[4]; if (i < 0) i = 0; return vsprintf (a + i, "124", va); // nowarn } int warn_vsprintf (va_list va, int i) { char a[4]; if (i < 1) i = 1; return vsprintf (a + i, "123", va); // warn } int nowarn_vsnprintf (va_list va, int i) { char a[4]; if (i < 0) i = 0; return vsnprintf (a + i, sizeof a, "124", va); // nowarn } int warn_vsnprintf (va_list va, int i) { char a[4]; if (i < 1) i = 1; return vsnprintf (a + i, sizeof a, "123", va); // warn } /* */ int nowarn_ptsname_r (int fd, int i) { char a[4]; if (i < 0) i = 0; return ptsname_r (fd, a + i, sizeof a); // nowarn } int warn_ptsname_r (int fd, int i) { char a[4]; if (i < 1) i = 1; return ptsname_r (fd, a + i, sizeof a); // warn } int nowarn_mbstowcs (const char *s, int i) { wchar_t a[4]; if (i < 0) i = 0; return mbstowcs (a + i, s, sizeof a / sizeof *a); // nowarn } int warn_mbstowcs (const char *s, int i) { wchar_t a[4]; if (i < 1) i = 1; return mbstowcs (a + i, s, sizeof a / sizeof *a); // warn } int nowarn_wcstombs (const wchar_t *s, int i) { char a[4]; if (i < 0) i = 0; return wcstombs (a + i, s, sizeof a / sizeof *a); // nowarn } int warn_wcstombs (const wchar_t *s, int i) { char a[4]; if (i < 1) i = 1; return wcstombs (a + i, s, sizeof a / sizeof *a); // warn } /* */ int nowarn_memccpy_1 (int i) { char a[4], b[4] = "123"; if (i < 0) i = 0; return !!memccpy (a + i, b, 'x', sizeof a); // nowarn } int nowarn_memccpy_2 (int i) { char a[4], b[4] = "123"; if (i < 0) i = 0; return !!memccpy (a, b + i, 'x', sizeof b); // nowarn } int warn_memccpy_1 (int i) { char a[4], b[4] = "123"; if (i < 1) i = 1; return !!memccpy (a + i, b, 'x', sizeof a); // warn } int warn_memccpy_2 (int i) { char a[4], b[4] = "123"; if (i < 1) i = 1; // This needs GCC support to see that B does not contain an 'x'. return !!memccpy (a, b + i, 'x', sizeof b); // should warn } int nowarn_memrchr (int i) { char a[4]; if (i < 0) i = 0; return !!memrchr (a + i, 'x', sizeof a); // nowarn } int warn_memrchr (int i) { char a[4]; if (i < 1) i = 1; return !!memrchr (a + i, 'x', sizeof a); // warn } int nowarn_strxfrm (const char *s, int i) { char a[4]; if (i < 0) i = 0; return strxfrm (a + i, s, sizeof a); // nowarn } int warn_strxfrm (const char *s, int i) { char a[4]; if (i < 1) i = 1; return strxfrm (a + i, s, sizeof a); // warn } int nowarn_memmem_1 (int i) { char a[4] = "123"; char b[4] = "321"; if (i < 0) i = 0; return !!memmem (a + i, sizeof a, b, sizeof b); // nowarn } int nowarn_memmem_2 (int i) { char a[4] = "123"; char b[4] = "321"; if (i < 0) i = 0; return !!memmem (a, sizeof a, b + i, sizeof b); // nowarn } int warn_memmem_1 (int i) { char a[4] = "123"; char b[4] = "321"; if (i < 1) i = 1; return !!memmem (a + i, sizeof a, b, sizeof b); // warn } int warn_memmem_2 (int i) { char a[4] = "123"; char b[4] = "321"; if (i < 1) i = 1; return !!memmem (a, sizeof a, b + i, sizeof b); // warn } int nowarn_strerror_r (int e, int i) { char a[4]; if (i < 0) i = 0; return !!strerror_r (e, a + i, sizeof a); // nowarn } int warn_strerror_r (int e, int i) { char a[4]; if (i < 1) i = 1; return !!strerror_r (e, a + i, sizeof a); // warn } void nowarn_explicit_bzero (int i) { char a[4]; if (i < 0) i = 0; explicit_bzero (a + i, sizeof a); // nowarn } void warn_explicit_bzero (int i) { char a[4]; if (i < 1) i = 1; explicit_bzero (a + i, sizeof a); // warn } void nowarn_memfrob (int i) { char a[4]; if (i < 0) i = 0; memfrob (a + i, sizeof a); // nowarn } void warn_memfrob (int i) { char a[4]; if (i < 1) i = 1; memfrob (a + i, sizeof a); // warn } /* */ int nowarn_read (int fd, int i) { char a[4]; if (i < 0) i = 0; return read (fd, a + i, sizeof a); // nowarn } int warn_read (int fd, int i) { char a[4]; if (i < 1) i = 1; return read (fd, a + i, sizeof a); // warn } int nowarn_pread (int fd, int i) { char a[4]; if (i < 0) i = 0; return pread (fd, a + i, sizeof a, 0); // nowarn } int warn_pread (int fd, int i) { char a[4]; if (i < 1) i = 1; return pread (fd, a + i, sizeof a, 0); // warn } int nowarn_pread64 (int fd, int i) { char a[4]; if (i < 0) i = 1; return pread64 (fd, a + i, sizeof a, 0); // nowarn } int warn_pread64 (int fd, int i) { char a[4]; if (i < 1) i = 1; return pread64 (fd, a + i, sizeof a, 0); // warn } int nowarn_readlink (const char *path, int i) { char a[4]; if (i < 0) i = 0; return readlink (path, a + i, sizeof a); // nowarn } int warn_readlink (const char *path, int i) { char a[4]; if (i < 1) i = 1; return readlink (path, a + i, sizeof a); // warn } int nowarn_readlinkat (int fd, const char *path, int i) { char a[4]; if (i < 0) i = 0; return readlinkat (fd, path, a + i, sizeof a); // nowarn } int warn_readlinkat (int fd, const char *path, int i) { char a[4]; if (i < 1) i = 1; return readlinkat (fd, path, a + i, sizeof a); // warn } char* nowarn_getcwd (int i) { char a[4]; if (i < 0) i = 0; return getcwd (a + i, sizeof a); // nowarn } char* warn_getcwd (int i) { char a[4]; if (i < 1) i = 1; return getcwd (a + i, sizeof a); // warn } char* nowarn_getwd (int i) { char a[4]; if (i < 0) i = 0; return getwd (a + i); // nowarn } char* warn_getwd (int i) { char a[4]; if (i < 4) i = 4; return getwd (a + i); // warn } int nowarn_confstr (int name, int i) { char a[4]; if (i < 0) i = 0; return confstr (name, a + i, sizeof a); // nowarn } int warn_confstr (int name, int i) { char a[4]; if (i < 1) i = 1; return confstr (name, a + i, sizeof a); // warn } int nowarn_ttyname_r (int name, int i) { char a[4]; if (i < 0) i = 0; return ttyname_r (name, a + i, sizeof a); // nowarn } int warn_ttyname_r (int name, int i) { char a[4]; if (i < 1) i = 1; return ttyname_r (name, a + i, sizeof a); // warn } int nowarn_getlogin_r (int i) { char a[4]; if (i < 0) i = 0; return getlogin_r (a + i, sizeof a); // nowarn } int warn_getlogin_r (int i) { char a[4]; if (i < 1) i = 1; return getlogin_r (a + i, sizeof a); // warn } int nowarn_gethostname (int i) { char a[4]; if (i < 0) i = 0; return gethostname (a + i, sizeof a); // nowarn } int warn_gethostname (int i) { char a[4]; if (i < 1) i = 1; return gethostname (a + i, sizeof a); // warn } int nowarn_getdomainname (int i) { char a[4]; if (i < 0) i = 0; return getdomainname (a + i, sizeof a); // nowarn } int warn_getdomainname (int i) { char a[4]; if (i < 1) i = 1; return getdomainname (a + i, sizeof a); // warn } void nowarn_swab_1 (int i) { char a[4], b[4]; if (i < 0) i = 0; swab (a + i, b, sizeof a); // nowarn } void warn_swab_1 (int i) { char a[4], b[4]; if (i < 1) i = 1; swab (a + i, b, sizeof a); // warn } void nowarn_swab_2 (int i) { char a[4], b[4]; if (i < 0) i = 0; swab (a, b + i, sizeof a); // nowarn } void warn_swab_2 (int i) { char a[4], b[4]; if (i < 1) i = 1; swab (a, b + i, sizeof a); // warn } int nowarn_getentropy (int i) { char a[4]; if (i < 0) i = 0; return getentropy (a + i, sizeof a); // nowarn } int warn_getentropy (int i) { char a[4]; if (i < 1) i = 1; return getentropy (a + i, sizeof a); // warn }