]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: fix clang SA warnings
authorChristian Hopps <chopps@labn.net>
Sun, 7 Jan 2024 09:41:32 +0000 (09:41 +0000)
committerChristian Hopps <chopps@labn.net>
Sun, 7 Jan 2024 15:04:18 +0000 (15:04 +0000)
Signed-off-by: Christian Hopps <chopps@labn.net>
lib/darr.h
lib/northbound_oper.c
mgmtd/mgmt_fe_adapter.c

index 2b6f0db0b9ce98874031b3585bf297287a8ec0c7..df8ace62dd153d69fe7db2eb1ae4af9c9e5efd10 100644 (file)
@@ -77,6 +77,7 @@
  */
 
 #include <zebra.h>
+#include <limits.h>
 #include "memory.h"
 
 DECLARE_MTYPE(DARR);
@@ -249,6 +250,10 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
  * pointers into the previous memory block are no longer valid. The `A` value
  * is guaranteed not to change if there is sufficient capacity in the array.
  *
+ * The exception to the no-change rule is if @C is passed as 0, it will be
+ * considered 1 so that an array is always allocated if currently NULL,
+ * i.e., @A will never be NULL after a call to darr_ensure_cap_mt()
+ *
  * Args:
  *     A: (IN/OUT) the dynamic array, can be NULL.
  *     C: Total capacity to guarantee.
@@ -259,8 +264,9 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
 #define darr_ensure_cap_mt(A, C, MT)                                           \
        ({                                                                     \
                /* Cast to avoid warning when C == 0 */                        \
-               if ((ssize_t)darr_cap(A) < (ssize_t)(C))                       \
-                       _darr_resize_mt((A), (C), MT);                         \
+               uint _c = (C) > 0 ? (C) : 1;                                   \
+               if ((size_t)darr_cap(A) < _c)                                  \
+                       _darr_resize_mt((A), _c, MT);                          \
                (A);                                                           \
        })
 #define darr_ensure_cap(A, C) darr_ensure_cap_mt(A, C, MTYPE_DARR)
@@ -285,11 +291,14 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
  */
 #define darr_ensure_i_mt(A, I, MT)                                             \
        ({                                                                     \
-               if ((int)(I) > darr_maxi(A))                                   \
-                       _darr_resize_mt((A), (I) + 1, MT);                     \
-               if ((I) + 1 > _darr_len(A))                                    \
-                       _darr_len(A) = (I) + 1;                                \
-               &(A)[I];                                                       \
+               assert((int)(I) >= 0 && (int)(I) <= INT_MAX);                  \
+               int _i = (int)(I);                                             \
+               if (_i > darr_maxi(A))                                         \
+                       _darr_resize_mt((A), _i + 1, MT);                      \
+               assert((A) != NULL);                                           \
+               if ((uint)_i + 1 > _darr_len(A))                               \
+                       _darr_len(A) = _i + 1;                                 \
+               &(A)[_i];                                                      \
        })
 #define darr_ensure_i(A, I) darr_ensure_i_mt(A, I, MTYPE_DARR)
 
index 334370d0aba0ec14d52b7ae933f4fc86e3e9e1fa..bd6d870ebcaf9955208ea4463b13407311a21b13 100644 (file)
@@ -806,6 +806,13 @@ static const struct lysc_node *nb_op_sib_first(struct nb_op_yield_state *ys,
        const struct lysc_node *sib = lysc_node_child(parent);
        const struct lysc_node *first_sib;
 
+       /*
+        * NOTE: when we want to handle root level walks we will need to use
+        * lys_getnext() to walk root level of each module and
+        * ly_ctx_get_module_iter() to walk the modules.
+        */
+       assert(darr_len(ys->node_infos) > 0);
+
        /*
         * The top of the node stack points at @parent.
         *
@@ -814,7 +821,7 @@ static const struct lysc_node *nb_op_sib_first(struct nb_op_yield_state *ys,
         * base of the user query, return the next schema node from the query
         * string (schema_path).
         */
-       assert(darr_last(ys->node_infos)->schema == parent);
+       assert(darr_last(ys->node_infos) != NULL && darr_last(ys->node_infos)->schema == parent);
        if (darr_lasti(ys->node_infos) < ys->query_base_level)
                return ys->schema_path[darr_lasti(ys->node_infos) + 1];
 
@@ -1010,10 +1017,14 @@ static enum nb_error __walk(struct nb_op_yield_state *ys, bool is_resume)
                         * should be kept.
                         */
                        ret = nb_op_iter_leaf(ys, nn, xpath_child);
+                       if (ret != NB_OK)
+                               goto done;
                        sib = nb_op_sib_next(ys, sib);
                        continue;
                case LYS_LEAFLIST:
                        ret = nb_op_iter_leaflist(ys, nn, xpath_child);
+                       if (ret != NB_OK)
+                               goto done;
                        sib = nb_op_sib_next(ys, sib);
                        continue;
                case LYS_CONTAINER:
index d98444703f21788e3e39311d6af3ba7e56d8f128..5f17b89c5c61b938ddb372c131e66ee13f2ad9d1 100644 (file)
@@ -1105,7 +1105,7 @@ static int fe_adapter_send_tree_data(struct mgmt_fe_session_ctx *session,
                                      LYD_PRINT_WITHSIBLINGS));
        /* buf may have been reallocated and moved */
        msg = (typeof(msg))buf;
-
+       (void)msg; /* suppress clang-SA unused warning on safety code */
 
        if (ret != LY_SUCCESS) {
                MGMTD_FE_ADAPTER_ERR("Error building get-tree result for client %s session-id %" PRIu64