diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2023-02-04 17:34:08 +0100 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2023-02-18 17:07:17 +0100 |
commit | 8387df1551f18b90b3936c7cbb311416c3db8032 (patch) | |
tree | 2cc511d578c0a2ea01226cc6b7f0d14e37294954 | |
parent | f60d4057573ecb6a5021e754f54983c709977c62 (diff) |
Annotate functions with access attribute
Supported by GCC since version 10.
-rw-r--r-- | Macros.h | 21 | ||||
-rw-r--r-- | XUtils.c | 1 | ||||
-rw-r--r-- | XUtils.h | 7 | ||||
-rw-r--r-- | configure.ac | 14 |
4 files changed, 43 insertions, 0 deletions
@@ -61,6 +61,27 @@ #endif /* HAVE_ATTR_ALLOC_SIZE */ +#ifdef HAVE_ATTR_ACCESS + +#define ATTR_ACCESS2(mode, ref) __attribute__((access (mode, ref))) +#define ATTR_ACCESS3(mode, ref, size) __attribute__((access (mode, ref, size))) + +#else + +#define ATTR_ACCESS2(mode, ref) +#define ATTR_ACCESS3(mode, ref, size) + +#endif /* HAVE_ATTR_ACCESS */ + +#define ATTR_ACCESS2_R(ref) ATTR_ACCESS2(read_only, ref) +#define ATTR_ACCESS3_R(ref, size) ATTR_ACCESS3(read_only, ref, size) + +#define ATTR_ACCESS2_RW(ref) ATTR_ACCESS2(read_write, ref) +#define ATTR_ACCESS3_RW(ref, size) ATTR_ACCESS3(read_write, ref, size) + +#define ATTR_ACCESS2_W(ref) ATTR_ACCESS2(write_only, ref) +#define ATTR_ACCESS3_W(ref, size) ATTR_ACCESS3(write_only, ref, size) + // ignore casts discarding const specifier, e.g. // const char [] -> char * / void * // const char *[2]' -> char *const * @@ -265,6 +265,7 @@ char* xStrndup(const char* str, size_t len) { return data; } +ATTR_ACCESS3_W(2, 3) static ssize_t readfd_internal(int fd, void* buffer, size_t count) { if (!count) { close(fd); @@ -57,22 +57,29 @@ void String_freeArray(char** s); char* String_readLine(FILE* fd) ATTR_MALLOC; /* Always null-terminates dest. Caller must pass a strictly positive size. */ +ATTR_ACCESS3_W(1, 3) +ATTR_ACCESS3_R(2, 3) size_t String_safeStrncpy(char* restrict dest, const char* restrict src, size_t size); ATTR_FORMAT(printf, 2, 3) int xAsprintf(char** strp, const char* fmt, ...); ATTR_FORMAT(printf, 3, 4) +ATTR_ACCESS3_W(1, 2) int xSnprintf(char* buf, size_t len, const char* fmt, ...); char* xStrdup(const char* str) ATTR_NONNULL ATTR_MALLOC; void free_and_xStrdup(char** ptr, const char* str); +ATTR_ACCESS3_R(1, 2) char* xStrndup(const char* str, size_t len) ATTR_NONNULL ATTR_MALLOC; +ATTR_ACCESS3_W(2, 3) ssize_t xReadfile(const char* pathname, void* buffer, size_t count); +ATTR_ACCESS3_W(3, 4) ssize_t xReadfileat(openat_arg_t dirfd, const char* pathname, void* buffer, size_t count); +ATTR_ACCESS3_R(2, 3) ssize_t full_write(int fd, const void* buf, size_t count); #endif diff --git a/configure.ac b/configure.ac index 73a8e91c..015f9046 100644 --- a/configure.ac +++ b/configure.ac @@ -188,6 +188,20 @@ AC_COMPILE_IFELSE([ AC_MSG_RESULT(no)) CFLAGS="$old_CFLAGS" +AC_MSG_CHECKING(for access) +old_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wno-error -Werror=attributes" +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE( + [ + __attribute__((access(read_only, 1, 2))) extern int foo(const char* str, unsigned len); + ],[] + )], + AC_DEFINE([HAVE_ATTR_ACCESS], 1, [The access attribute is supported.]) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) +CFLAGS="$old_CFLAGS" + AC_MSG_CHECKING(for NaN support) AC_RUN_IFELSE([ AC_LANG_PROGRAM( |