[dpdk-dev] [PATCH 2/3] crypto: fix pedentic compilation errors

Gaëtan Rivet gaetan.rivet at 6wind.com
Wed Nov 22 15:31:51 CET 2017


On Wed, Nov 22, 2017 at 08:56:14AM -0500, Neil Horman wrote:
> On Wed, Nov 22, 2017 at 09:10:17AM +0100, Nelio Laranjeiro wrote:
> >  /root/dpdk/x86_64-native-linuxapp-gcc/include/rte_crypto.h:126:28: error: ISO C forbids zero-size array ‘sym’ [-Werror=pedantic]
> >    struct rte_crypto_sym_op sym[0];
> >                             ^~~
> > 
> > Fixes: d2a4223c4c6d ("cryptodev: do not store pointer to op specific params")
> > Cc: pablo.de.lara.guarch at intel.com
> > Cc: stable at dpdk.org
> > 
> > Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>
> > ---
> >  lib/librte_cryptodev/rte_crypto.h | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/lib/librte_cryptodev/rte_crypto.h b/lib/librte_cryptodev/rte_crypto.h
> > index 3d672fe7d..dc6e91d1d 100644
> > --- a/lib/librte_cryptodev/rte_crypto.h
> > +++ b/lib/librte_cryptodev/rte_crypto.h
> > @@ -123,7 +123,7 @@ struct rte_crypto_op {
> >  
> >  	RTE_STD_C11
> >  	union {
> > -		struct rte_crypto_sym_op sym[0];
> > +		struct rte_crypto_sym_op *sym;
> >  		/**< Symmetric operation parameters */
> >  	}; /**< operation specific parameters */
> >  };
> > -- 
> > 2.11.0
> > 
> > 
> As Laura notes, this isn't the right solution.  In addition to adding a 64 bit
> pointer, it I think also results in incorrect semantics.  That is to say, the
> allocation path for this structure allocates the rte_crypto_op and additional
> memory for the sym array contiguously, which the sym[0] syntax correctly
> interprets to mean the storage for the array is inline with the structure.
> Changing to a pointer means you are using the first elements of the array
> storage as your pointer, which could be filled with any old value, leading to
> corruption.
> 
> If you can't use zero length array semantics (which I assume you cant, as I
> don't think clang supports that), a better soution might be to remove the sym
> variable entirely, and replace it with a macro that access the sym array as an
> offset from the start of the pointer.  That would seem to be an ABI change, but
> if you went through that process you would wind up with the same sized struct,
> which would be nice
> 
> Neil
> 

ISO C forbids zero-size arrays, but ISO C99 allows flexible arrays.
Why is this symbole within a union? Why not remove the union, change
sym[0] to sym[]?

-- 
Gaëtan Rivet
6WIND


More information about the dev mailing list