summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2019-07-29 15:49:49 +0200
committerDavid Lamparter <equinox@diac24.net>2019-07-29 15:49:49 +0200
commit4937287fb91fdb871a225b0339780ea8c4ac138d (patch)
treed20c89dc7ba71d2299e7647900ed97e35a2f9920 /lib
parentlib: fix misplaced brace in typesafe lists (diff)
downloadfrr-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.c4
-rw-r--r--lib/prefix.h8
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 *,