vppinfra: type prove vec_new and vec_resize 15/26315/4
authorAndreas Schultz <andreas.schultz@travelping.com>
Thu, 26 Mar 2020 14:18:52 +0000 (14:18 +0000)
committerDamjan Marion <dmarion@me.com>
Tue, 28 Apr 2020 21:16:58 +0000 (21:16 +0000)
Some vector functions (e.g. vec_new) pass the vector pointer through
vec_resize. This turn the pointer from a real type into a void pointer.
Explicitly cast the pointer back to its original type to catch type
mismatches.

Type: improvement

Signed-off-by: Andreas Schultz <andreas.schultz@travelping.com>
Change-Id: Id13e52d4f038af2cee28e5abf1aca720f8909378

src/vppinfra/vec.h

index e983610..df913c2 100644 (file)
@@ -116,8 +116,12 @@ void *vec_resize_allocate_memory (void *v,
     @return v_prime pointer to resized vector, may or may not equal v
 */
 
-#define _vec_resize_numa(V,L,DB,HB,A,S) \
-  _vec_resize_inline(V,L,DB,HB,clib_max((__alignof__((V)[0])),(A)),(S))
+#define _vec_resize_numa(V,L,DB,HB,A,S)                                        \
+({                                                                     \
+  __typeof__ ((V)) _V;                                                 \
+  _V = _vec_resize_inline(V,L,DB,HB,clib_max((__alignof__((V)[0])),(A)),(S)); \
+  _V;                                                                  \
+})
 
 #define _vec_resize(V,L,DB,HB,A)  \
   _vec_resize_numa(V,L,DB,HB,A,VEC_NUMA_UNSPECIFIED)
@@ -330,10 +334,10 @@ do {                                              \
     @param A alignment (may be zero)
     @return V new vector
 */
-#define vec_new_ha(T,N,H,A)                                    \
-({                                                             \
-  word _v(n) = (N);                                            \
-  _vec_resize ((T *) 0, _v(n), _v(n) * sizeof (T), (H), (A));  \
+#define vec_new_ha(T,N,H,A)                                            \
+({                                                                     \
+  word _v(n) = (N);                                                    \
+  (T *)_vec_resize ((T *) 0, _v(n), _v(n) * sizeof (T), (H), (A));     \
 })
 
 /** \brief Create new vector of given type and length