diff --git a/lib/prefix.c b/lib/prefix.c index 78a97fd1480e..1a4a914e05e5 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 5f88eaae052c..e338140f1ae8 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 *,