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