]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: fix prefix_copy() for clang-SA
authorDavid Lamparter <equinox@diac24.net>
Mon, 29 Jul 2019 13:49:49 +0000 (15:49 +0200)
committerDavid Lamparter <equinox@diac24.net>
Mon, 29 Jul 2019 13:49:49 +0000 (15:49 +0200)
https://bugs.llvm.org/show_bug.cgi?id=42811

Signed-off-by: David Lamparter <equinox@diac24.net>
lib/prefix.c
lib/prefix.h

index 78a97fd1480ea50281a631ffb54f3971e7267ca4..1a4a914e05e54127abb28aa4d3ea146c2b811b23 100644 (file)
@@ -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;
index 5f88eaae052c7b73a597c3b39d535003dbcaeada..e338140f1ae80c8c51dba10ef9dfdd41695d2186 100644 (file)
@@ -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 *,