]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Lib: Use access() function attribute
authorOndrej Zajicek <santiago@crfreenet.org>
Wed, 29 May 2024 11:03:10 +0000 (13:03 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Wed, 29 May 2024 11:03:10 +0000 (13:03 +0200)
lib/birdlib.h
lib/ip.h
lib/net.h
lib/string.h
nest/attrs.h

index fac7e4eacd661156e9a49cfbe3916bb7332ebb42..a520fdb38d9fbd4344bb2dd5cfb6d8e53ede54f4 100644 (file)
@@ -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)
 
index 0a25d5bccaa319261609851c0cf5699aa1747581..f9aa7f664226873a00f367751ce4ea2c002c6900 100644 (file)
--- 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++)
index 18788f8d78480f2a2b805cc24fb43dd4acb0543a..d1b55c07272706c31ae3f53db8d7849349d8e57d 100644 (file)
--- 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))); }
index 161b7651d9cfa77e28c229e8556195722fd7d4cb..0c21f51332cd192f4962a27ee38366655a2a810b 100644 (file)
@@ -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);
 
index 8b13e7a4640ac169776eaadb9f1b7b2d2f73919c..0475afa72c8f2f7239e760f5a395c8c05c64acb3 100644 (file)
@@ -41,7 +41,7 @@ struct adata *as_path_prepend2(struct linpool *pool, const struct adata *op, int
 struct adata *as_path_to_old(struct linpool *pool, const struct adata *path);
 struct adata *as_path_cut(struct linpool *pool, const struct adata *path, uint num);
 const struct adata *as_path_merge(struct linpool *pool, const struct adata *p1, const struct adata *p2);
-void as_path_format(const struct adata *path, byte *buf, uint size);
+void as_path_format(const struct adata *path, byte *buf, uint size) ACCESS_WRITE(2, 3);
 int as_path_getlen(const struct adata *path);
 int as_path_getlen_int(const struct adata *path, int bs);
 int as_path_get_first(const struct adata *path, u32 *orig_as);
@@ -212,11 +212,11 @@ enum isf_way {
   ISF_ROUTER_ID,
 };
 
-int int_set_format(const struct adata *set, enum isf_way way, int from, byte *buf, uint size);
+int int_set_format(const struct adata *set, enum isf_way way, int from, byte *buf, uint size) ACCESS_WRITE(4, 5);
 int ec_format(byte *buf, u64 ec);
-int ec_set_format(const struct adata *set, int from, byte *buf, uint size);
+int ec_set_format(const struct adata *set, int from, byte *buf, uint size) ACCESS_WRITE(3, 4);
 int lc_format(byte *buf, lcomm lc);
-int lc_set_format(const struct adata *set, int from, byte *buf, uint size);
+int lc_set_format(const struct adata *set, int from, byte *buf, uint size) ACCESS_WRITE(3, 4);
 int int_set_contains(const struct adata *list, u32 val);
 int ec_set_contains(const struct adata *list, u64 val);
 int lc_set_contains(const struct adata *list, lcomm val);