summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/birdlib.h10
-rw-r--r--lib/ip.h2
-rw-r--r--lib/net.h4
-rw-r--r--lib/string.h6
4 files changed, 16 insertions, 6 deletions
diff --git a/lib/birdlib.h b/lib/birdlib.h
index fac7e4ea..a520fdb3 100644
--- a/lib/birdlib.h
+++ b/lib/birdlib.h
@@ -78,6 +78,16 @@ static inline int u64_cmp(u64 i1, u64 i2)
#define NONNULL(...) __attribute__((nonnull(__VA_ARGS__)))
#define ALLOC_SIZE(...) __attribute__((alloc_size(__VA_ARGS__)))
+#if __GNUC_PREREQ(10, 0)
+#define ACCESS_READ(...) __attribute__((access(read_only, __VA_ARGS__)))
+#define ACCESS_WRITE(...) __attribute__((access(write_only, __VA_ARGS__)))
+#define ACCESS_RW(...) __attribute__((access(read_write, __VA_ARGS__)))
+#else
+#define ACCESS_READ(...)
+#define ACCESS_WRITE(...)
+#define ACCESS_RW(...)
+#endif
+
#define STATIC_ASSERT(EXP) _Static_assert(EXP, #EXP)
#define STATIC_ASSERT_MSG(EXP,MSG) _Static_assert(EXP, MSG)
diff --git a/lib/ip.h b/lib/ip.h
index 0a25d5bc..f9aa7f66 100644
--- a/lib/ip.h
+++ b/lib/ip.h
@@ -398,7 +398,7 @@ typedef struct mpls_label_stack {
u32 stack[MPLS_MAX_LABEL_STACK];
} mpls_label_stack;
-static inline int
+static inline int ACCESS_READ(1, 2)
mpls_get(const char *buf, int buflen, u32 *stack)
{
for (int i=0; (i<MPLS_MAX_LABEL_STACK) && (i*4+3 < buflen); i++)
diff --git a/lib/net.h b/lib/net.h
index 18788f8d..d1b55c07 100644
--- a/lib/net.h
+++ b/lib/net.h
@@ -639,8 +639,8 @@ void net_normalize(net_addr *N);
int net_classify(const net_addr *N);
-int net_format(const net_addr *N, char *buf, int buflen);
-int rd_format(const u64 rd, char *buf, int buflen);
+int net_format(const net_addr *N, char *buf, int buflen) ACCESS_WRITE(2, 3);
+int rd_format(const u64 rd, char *buf, int buflen) ACCESS_WRITE(2, 3);
static inline int ipa_in_px4(ip4_addr a, ip4_addr prefix, uint pxlen)
{ return ip4_zero(ip4_and(ip4_xor(a, prefix), ip4_mkmask(pxlen))); }
diff --git a/lib/string.h b/lib/string.h
index 161b7651..0c21f513 100644
--- a/lib/string.h
+++ b/lib/string.h
@@ -17,8 +17,8 @@
int bsprintf(char *str, const char *fmt, ...);
int bvsprintf(char *str, const char *fmt, va_list args);
-int bsnprintf(char *str, int size, const char *fmt, ...);
-int bvsnprintf(char *str, int size, const char *fmt, va_list args);
+int bsnprintf(char *str, int size, const char *fmt, ...) ACCESS_WRITE(1, 2);
+int bvsnprintf(char *str, int size, const char *fmt, va_list args) ACCESS_WRITE(1, 2);
char *mb_sprintf(pool *p, const char *fmt, ...);
char *mb_vsprintf(pool *p, const char *fmt, va_list args);
@@ -34,7 +34,7 @@ u64 bstrtoul16(const char *str, char **end);
byte bstrtobyte16(const char *str);
int bstrhextobin(const char *s, byte *b);
-int bstrbintohex(const byte *b, size_t len, char *buf, size_t size, char delim);
+int bstrbintohex(const byte *b, size_t len, char *buf, size_t size, char delim) ACCESS_READ(1, 2) ACCESS_WRITE(3, 4);
int patmatch(const byte *pat, const byte *str);