diff options
author | David Lamparter <equinox@diac24.net> | 2019-07-29 15:49:49 +0200 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2019-07-29 15:49:49 +0200 |
commit | 4937287fb91fdb871a225b0339780ea8c4ac138d (patch) | |
tree | d20c89dc7ba71d2299e7647900ed97e35a2f9920 /lib | |
parent | lib: fix misplaced brace in typesafe lists (diff) | |
download | frr-4937287fb91fdb871a225b0339780ea8c4ac138d.tar.xz frr-4937287fb91fdb871a225b0339780ea8c4ac138d.zip |
lib: fix prefix_copy() for clang-SA
https://bugs.llvm.org/show_bug.cgi?id=42811
Signed-off-by: David Lamparter <equinox@diac24.net>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/prefix.c | 4 | ||||
-rw-r--r-- | lib/prefix.h | 8 |
2 files changed, 12 insertions, 0 deletions
diff --git a/lib/prefix.c b/lib/prefix.c index 78a97fd14..1a4a914e0 100644 --- a/lib/prefix.c +++ b/lib/prefix.c @@ -628,6 +628,10 @@ int prefix_match_network_statement(const struct prefix *n, return 1; } +#ifdef __clang_analyzer__ +#undef prefix_copy /* cf. prefix.h */ +#endif + void prefix_copy(union prefixptr udest, union prefixconstptr usrc) { struct prefix *dest = udest.p; diff --git a/lib/prefix.h b/lib/prefix.h index 5f88eaae0..e338140f1 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -416,6 +416,14 @@ extern int prefix_common_bits(const struct prefix *, const struct prefix *); extern void prefix_copy(union prefixptr, union prefixconstptr); extern void apply_mask(struct prefix *); +#ifdef __clang_analyzer__ +/* clang-SA doesn't understand transparent unions, making it think that the + * target of prefix_copy is uninitialized. So just memset the target. + * cf. https://bugs.llvm.org/show_bug.cgi?id=42811 + */ +#define prefix_copy(a, b) ({ memset(a, 0, sizeof(*a)); prefix_copy(a, b); }) +#endif + extern struct prefix *sockunion2prefix(const union sockunion *dest, const union sockunion *mask); extern struct prefix *sockunion2hostprefix(const union sockunion *, |