vppinfra: make coverity happy with vec_set_len
[vpp.git] / src / vppinfra / vec_bootstrap.h
index bff6889..5c42e5e 100644 (file)
@@ -39,7 +39,7 @@
 #define included_clib_vec_bootstrap_h
 
 /** \file
-    Vector bootsrap header file
+    Vector bootstrap header file
 */
 
 /* Bootstrap include so that #include <vppinfra/mem.h> can include e.g.
@@ -47,7 +47,7 @@
 
 /** \brief vector header structure
 
-   Bookeeping header preceding vector elements in memory.
+   Bookkeeping header preceding vector elements in memory.
    User header information may preceed standard vec header.
    If you change u32 len -> u64 len, single vectors can
    exceed 2**32 elements. Clib heaps are vectors. */
@@ -142,12 +142,6 @@ vec_aligned_header_end (void *v, uword header_bytes, uword align)
 
 #define vec_len(v)     ((v) ? _vec_len(v) : 0)
 
-/** \brief Reset vector length to zero
-    NULL-pointer tolerant
-*/
-
-#define vec_reset_length(v) do { if (v) _vec_len (v) = 0; } while (0)
-
 /** \brief Number of data bytes in vector. */
 
 #define vec_bytes(v) (vec_len (v) * sizeof (v[0]))
@@ -165,6 +159,24 @@ vec_aligned_header_end (void *v, uword header_bytes, uword align)
 /** \brief Total number of elements that can fit into vector. */
 #define vec_max_len(v) (vec_capacity(v,0) / sizeof (v[0]))
 
+/** \brief Set vector length to a user-defined value */
+#ifndef __COVERITY__           /* Coverity gets confused by ASSERT() */
+#define vec_set_len(v, l) do {     \
+    ASSERT(v);                     \
+    ASSERT((l) <= vec_max_len(v)); \
+    _vec_len(v) = (l);             \
+} while (0)
+#else /* __COVERITY__ */
+#define vec_set_len(v, l) do {     \
+    _vec_len(v) = (l);             \
+} while (0)
+#endif /* __COVERITY__ */
+
+/** \brief Reset vector length to zero
+    NULL-pointer tolerant
+*/
+#define vec_reset_length(v) do { if (v) vec_set_len (v, 0); } while (0)
+
 /** \brief End (last data address) of vector. */
 #define vec_end(v)     ((v) + vec_len (v))