misc: add address sanitizer heap instrumentation
[vpp.git] / src / vppinfra / vec_bootstrap.h
index 6db83f2..fbb01b6 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,25 @@ 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)); \
+    CLIB_MEM_POISON_LEN((void *)(v), _vec_len(v) * sizeof((v)[0]), (l) * sizeof((v)[0])); \
+    _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))
 
@@ -191,6 +204,10 @@ for (var = vec_end (vec) - 1; var >= (vec); var--)
 /** \brief Iterate over vector indices. */
 #define vec_foreach_index(var,v) for ((var) = 0; (var) < vec_len (v); (var)++)
 
+/** \brief Iterate over vector indices (reverse). */
+#define vec_foreach_index_backwards(var,v) \
+  for ((var) = vec_len((v)) - 1; (var) >= 0; (var)--)
+
 #endif /* included_clib_vec_bootstrap_h */
 
 /*