From d04c18397946f87ac4495351537c31a3d67257da Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 14 May 2013 16:08:43 -0700 Subject: [PATCH] Add more __restricts, clean up __format__ attributes. Change-Id: I7e2d270cc722d339d221eaea92747eaff3b51403 --- libc/include/err.h | 32 +++---- libc/include/stdio.h | 149 +++++++++++++---------------- libc/include/sys/cdefs.h | 3 + libc/private/libc_logging.h | 8 +- libc/upstream-netbsd/port_before.h | 2 +- 5 files changed, 93 insertions(+), 101 deletions(-) diff --git a/libc/include/err.h b/libc/include/err.h index 1636efe92..f24da6141 100644 --- a/libc/include/err.h +++ b/libc/include/err.h @@ -48,42 +48,42 @@ __BEGIN_DECLS __noreturn void err(int, const char *, ...) - __attribute__((__format__ (printf, 2, 3))); + __printflike(2, 3); __noreturn void verr(int, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))); + __printflike(2, 0); __noreturn void errx(int, const char *, ...) - __attribute__((__format__ (printf, 2, 3))); + __printflike(2, 3); __noreturn void verrx(int, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))); + __printflike(2, 0); void warn(const char *, ...) - __attribute__((__format__ (printf, 1, 2))); + __printflike(1, 2); void vwarn(const char *, __va_list) - __attribute__((__format__ (printf, 1, 0))); + __printflike(1, 0); void warnx(const char *, ...) - __attribute__((__format__ (printf, 1, 2))); + __printflike(1, 2); void vwarnx(const char *, __va_list) - __attribute__((__format__ (printf, 1, 0))); + __printflike(1, 0); /* * The _* versions are for use in library functions so user-defined * versions of err*,warn* do not get used. */ __noreturn void _err(int, const char *, ...) - __attribute__((__format__ (printf, 2, 3))); + __printflike(2, 3); __noreturn void _verr(int, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))); + __printflike(2, 0); __noreturn void _errx(int, const char *, ...) - __attribute__((__format__ (printf, 2, 3))); + __printflike(2, 3); __noreturn void _verrx(int, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))); + __printflike(2, 0); void _warn(const char *, ...) - __attribute__((__format__ (printf, 1, 2))); + __printflike(1, 2); void _vwarn(const char *, __va_list) - __attribute__((__format__ (printf, 1, 0))); + __printflike(1, 0); void _warnx(const char *, ...) - __attribute__((__format__ (printf, 1, 2))); + __printflike(1, 2); void _vwarnx(const char *, __va_list) - __attribute__((__format__ (printf, 1, 0))); + __printflike(1, 0); __END_DECLS diff --git a/libc/include/stdio.h b/libc/include/stdio.h index 31e926176..aca6d9ff0 100644 --- a/libc/include/stdio.h +++ b/libc/include/stdio.h @@ -139,8 +139,8 @@ __END_DECLS #define __SMBF 0x0080 /* _buf is from malloc */ #define __SAPP 0x0100 /* fdopen()ed in append mode */ #define __SSTR 0x0200 /* this is an sprintf/snprintf string */ -#define __SOPT 0x0400 /* do fseek() optimisation */ -#define __SNPT 0x0800 /* do not do fseek() optimisation */ +#define __SOPT 0x0400 /* do fseek() optimization */ +#define __SNPT 0x0800 /* do not do fseek() optimization */ #define __SOFF 0x1000 /* set iff _offset is in fact correct */ #define __SMOD 0x2000 /* true => fgetln modified _p text */ #define __SALC 0x4000 /* allocate string space dynamically */ @@ -160,14 +160,14 @@ __END_DECLS #define _IONBF 2 /* setvbuf should set unbuffered */ #define BUFSIZ 1024 /* size of buffer used by setbuf */ - #define EOF (-1) /* - * FOPEN_MAX is a minimum maximum, and should be the number of descriptors - * that the kernel can provide without allocation of a resource that can - * fail without the process sleeping. Do not use this for anything. + * FOPEN_MAX is a minimum maximum, and is the number of streams that + * stdio can provide without attempting to allocate further resources + * (which could fail). Do not use this for anything. */ + #define FOPEN_MAX 20 /* must be <= OPEN_MAX */ #define FILENAME_MAX 1024 /* must be <= PATH_MAX */ @@ -178,6 +178,7 @@ __END_DECLS #define L_tmpnam 1024 /* XXX must be == PATH_MAX */ #define TMP_MAX 308915776 +/* Always ensure that these are consistent with and ! */ #ifndef SEEK_SET #define SEEK_SET 0 /* set file offset to offset */ #endif @@ -202,25 +203,20 @@ int feof(FILE *); int ferror(FILE *); int fflush(FILE *); int fgetc(FILE *); -int fgetpos(FILE *, fpos_t *); -char *fgets(char *, int, FILE *); -FILE *fopen(const char *, const char *); -int fprintf(FILE *, const char *, ...) - __attribute__((__format__ (printf, 2, 3))) - __attribute__((__nonnull__ (2))); +char *fgets(char * __restrict, int, FILE * __restrict); +FILE *fopen(const char * __restrict , const char * __restrict); +int fprintf(FILE * __restrict , const char * __restrict, ...) + __printflike(2, 3); int fputc(int, FILE *); -int fputs(const char *, FILE *); -size_t fread(void *, size_t, size_t, FILE *); -FILE *freopen(const char *, const char *, FILE *); -int fscanf(FILE *, const char *, ...) - __attribute__ ((__format__ (scanf, 2, 3))) - __attribute__ ((__nonnull__ (2))); +int fputs(const char * __restrict, FILE * __restrict); +size_t fread(void * __restrict, size_t, size_t, FILE * __restrict); +FILE *freopen(const char * __restrict, const char * __restrict, + FILE * __restrict); +int fscanf(FILE * __restrict, const char * __restrict, ...) + __scanflike(2, 3); int fseek(FILE *, long, int); -int fseeko(FILE *, off_t, int); -int fsetpos(FILE *, const fpos_t *); long ftell(FILE *); -off_t ftello(FILE *); -size_t fwrite(const void *, size_t, size_t, FILE *); +size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict); int getc(FILE *); int getchar(void); ssize_t getdelim(char ** __restrict, size_t * __restrict, int, @@ -234,55 +230,55 @@ extern int sys_nerr; /* perror(3) external variables */ extern char *sys_errlist[]; #endif void perror(const char *); -int printf(const char *, ...) - __attribute__((__format__ (printf, 1, 2))) - __attribute__((__nonnull__ (1))); +int printf(const char * __restrict, ...) + __printflike(1, 2); int putc(int, FILE *); int putchar(int); int puts(const char *); int remove(const char *); -int rename(const char *, const char *); void rewind(FILE *); -int scanf(const char *, ...) - __attribute__ ((__format__ (scanf, 1, 2))) - __attribute__ ((__nonnull__ (1))); -void setbuf(FILE *, char *); -int setvbuf(FILE *, char *, int, size_t); -int sprintf(char *, const char *, ...) - __attribute__((__format__ (printf, 2, 3))) - __attribute__((__nonnull__ (2))); -int sscanf(const char *, const char *, ...) - __attribute__ ((__format__ (scanf, 2, 3))) - __attribute__ ((__nonnull__ (2))); +int scanf(const char * __restrict, ...) + __scanflike(1, 2); +void setbuf(FILE * __restrict, char * __restrict); +int setvbuf(FILE * __restrict, char * __restrict, int, size_t); +int sscanf(const char * __restrict, const char * __restrict, ...) + __scanflike(2, 3); FILE *tmpfile(void); -char *tmpnam(char *); int ungetc(int, FILE *); -int vfprintf(FILE *, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))) - __attribute__((__nonnull__ (2))); -int vprintf(const char *, __va_list) - __attribute__((__format__ (printf, 1, 0))) - __attribute__((__nonnull__ (1))); -int vsprintf(char *, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))) - __attribute__((__nonnull__ (2))); +int vfprintf(FILE * __restrict, const char * __restrict, __va_list) + __printflike(2, 0); +int vprintf(const char * __restrict, __va_list) + __printflike(1, 0); + +#ifndef __AUDIT__ +char *gets(char *); +int sprintf(char * __restrict, const char * __restrict, ...) + __printflike(2, 3); +char *tmpnam(char *); +int vsprintf(char * __restrict, const char * __restrict, + __va_list) + __printflike(2, 0); +#endif + +int rename (const char *, const char *); + +int fgetpos(FILE * __restrict, fpos_t * __restrict); +int fsetpos(FILE *, const fpos_t *); + +int fseeko(FILE *, off_t, int); +off_t ftello(FILE *); #if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE -int snprintf(char *, size_t, const char *, ...) - __attribute__((__format__ (printf, 3, 4))) - __attribute__((__nonnull__ (3))); -int vfscanf(FILE *, const char *, __va_list) - __attribute__((__format__ (scanf, 2, 0))) - __attribute__((__nonnull__ (2))); +int snprintf(char * __restrict, size_t, const char * __restrict, ...) + __printflike(3, 4); +int vfscanf(FILE * __restrict, const char * __restrict, __va_list) + __scanflike(2, 0); int vscanf(const char *, __va_list) - __attribute__((__format__ (scanf, 1, 0))) - __attribute__((__nonnull__ (1))); -int vsnprintf(char *, size_t, const char *, __va_list) - __attribute__((__format__ (printf, 3, 0))) - __attribute__((__nonnull__ (3))); -int vsscanf(const char *, const char *, __va_list) - __attribute__((__format__ (scanf, 2, 0))) - __attribute__((__nonnull__ (2))); + __scanflike(1, 0); +int vsnprintf(char * __restrict, size_t, const char * __restrict, __va_list) + __printflike(3, 0); +int vsscanf(const char * __restrict, const char * __restrict, __va_list) + __scanflike(2, 0); #endif /* __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE */ __END_DECLS @@ -335,18 +331,17 @@ __END_DECLS */ #if __BSD_VISIBLE __BEGIN_DECLS -int asprintf(char **, const char *, ...) - __attribute__((__format__ (printf, 2, 3))) - __attribute__((__nonnull__ (2))); -char *fgetln(FILE *, size_t *); +int asprintf(char ** __restrict, const char * __restrict, ...) + __printflike(2, 3); +char *fgetln(FILE * __restrict, size_t * __restrict); int fpurge(FILE *); int getw(FILE *); int putw(int, FILE *); void setbuffer(FILE *, char *, int); int setlinebuf(FILE *); -int vasprintf(char **, const char *, __va_list) - __attribute__((__format__ (printf, 2, 0))) - __attribute__((__nonnull__ (2))); +int vasprintf(char ** __restrict, const char * __restrict, + __va_list) + __printflike(2, 0); __END_DECLS /* @@ -449,11 +444,9 @@ extern int __isthreaded; */ __BEGIN_DECLS int fdprintf(int, const char*, ...) - __attribute__((__format__ (printf, 2, 3))) - __attribute__((__nonnull__ (2))); + __printflike(2, 3); int vfdprintf(int, const char*, __va_list) - __attribute__((__format__ (printf, 2, 0))) - __attribute__((__nonnull__ (2))); + __printflike(2, 0); __END_DECLS #endif /* _GNU_SOURCE */ @@ -462,24 +455,21 @@ __END_DECLS __BEGIN_DECLS __BIONIC_FORTIFY_INLINE -__attribute__((__format__ (printf, 3, 0))) -__attribute__((__nonnull__ (3))) +__printflike(3, 0) int vsnprintf(char *dest, size_t size, const char *format, __va_list ap) { return __builtin___vsnprintf_chk(dest, size, 0, __bos(dest), format, ap); } __BIONIC_FORTIFY_INLINE -__attribute__((__format__ (printf, 2, 0))) -__attribute__((__nonnull__ (2))) +__printflike(2, 0) int vsprintf(char *dest, const char *format, __va_list ap) { return __builtin___vsprintf_chk(dest, 0, __bos(dest), format, ap); } __BIONIC_FORTIFY_INLINE -__attribute__((__format__ (printf, 3, 4))) -__attribute__((__nonnull__ (3))) +__printflike(3, 4) int snprintf(char *str, size_t size, const char *format, ...) { return __builtin___snprintf_chk(str, size, 0, @@ -487,8 +477,7 @@ int snprintf(char *str, size_t size, const char *format, ...) } __BIONIC_FORTIFY_INLINE -__attribute__((__format__ (printf, 2, 3))) -__attribute__((__nonnull__ (2))) +__printflike(2, 3) int sprintf(char *dest, const char *format, ...) { return __builtin___sprintf_chk(dest, 0, diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h index 6d4abbd83..c71035633 100644 --- a/libc/include/sys/cdefs.h +++ b/libc/include/sys/cdefs.h @@ -211,6 +211,9 @@ #define __statement(x) (x) #endif +#define __printflike(x, y) __attribute__((__format__(printf, x, y))) __attribute__((__nonnull__(x))) +#define __scanflike(x, y) __attribute__((__format__(scanf, x, y))) __attribute__((__nonnull__(x))) + /* * C99 defines the restrict type qualifier keyword, which was made available * in GCC 2.92. diff --git a/libc/private/libc_logging.h b/libc/private/libc_logging.h index 281bad3ab..c6e176597 100644 --- a/libc/private/libc_logging.h +++ b/libc/private/libc_logging.h @@ -79,7 +79,7 @@ __LIBC_HIDDEN__ void __libc_set_abort_message(const char* msg); // __LIBC_HIDDEN__ __noreturn void __libc_fatal(const char* format, ...) - __attribute__((__format__(printf, 1, 2))); + __printflike(1, 2); // // Formatting routines for the C library's internal debugging. @@ -87,13 +87,13 @@ __LIBC_HIDDEN__ __noreturn void __libc_fatal(const char* format, ...) // __LIBC_HIDDEN__ int __libc_format_buffer(char* buffer, size_t buffer_size, const char* format, ...) - __attribute__((__format__(printf, 3, 4))); + __printflike(3, 4); __LIBC_HIDDEN__ int __libc_format_fd(int fd, const char* format, ...) - __attribute__((__format__(printf, 2, 3))); + __printflike(2, 3); __LIBC_HIDDEN__ int __libc_format_log(int priority, const char* tag, const char* format, ...) - __attribute__((__format__(printf, 3, 4))); + __printflike(3, 4); __LIBC_HIDDEN__ int __libc_format_log_va_list(int priority, const char* tag, const char* format, va_list ap); diff --git a/libc/upstream-netbsd/port_before.h b/libc/upstream-netbsd/port_before.h index 70eed2687..9f77f79ea 100644 --- a/libc/upstream-netbsd/port_before.h +++ b/libc/upstream-netbsd/port_before.h @@ -21,7 +21,7 @@ #include #include -#define ISC_FORMAT_PRINTF(a,b) __attribute__((__format__(__printf__,a,b))) +#define ISC_FORMAT_PRINTF(a,b) __printflike(a,b) #define ISC_SOCKLEN_T socklen_t #endif