diff mbox

[ovs-dev,4/5] test-hash: Fix unaligned pointers.

Message ID 20170525174246.GD2820@ovn.org
State Superseded
Headers show

Commit Message

Ben Pfaff May 25, 2017, 5:42 p.m. UTC
On Tue, May 23, 2017 at 04:02:15PM -0700, Joe Stringer wrote:
> Clang 4.0 complains:
> 
> ../tests/test-hash.c:160:16: error: taking address of packed member 'b' of
> class or structure 'offset_ovs_u128' may result in an unaligned pointer value
>       [-Werror,-Waddress-of-packed-member]
>         in0 = &in0_data.b;
> 
> Rework the 128-bit hash test to have a separate function for setting
> bits in the 32-bit offset u128 structure.
> 
> Signed-off-by: Joe Stringer <joe@ovn.org>

How about something like this, to reduce code duplication?  I have not
tested it with Clang 4.0.

Comments

Joe Stringer May 25, 2017, 8:18 p.m. UTC | #1
On 25 May 2017 at 10:42, Ben Pfaff <blp@ovn.org> wrote:
> On Tue, May 23, 2017 at 04:02:15PM -0700, Joe Stringer wrote:
>> Clang 4.0 complains:
>>
>> ../tests/test-hash.c:160:16: error: taking address of packed member 'b' of
>> class or structure 'offset_ovs_u128' may result in an unaligned pointer value
>>       [-Werror,-Waddress-of-packed-member]
>>         in0 = &in0_data.b;
>>
>> Rework the 128-bit hash test to have a separate function for setting
>> bits in the 32-bit offset u128 structure.
>>
>> Signed-off-by: Joe Stringer <joe@ovn.org>
>
> How about something like this, to reduce code duplication?  I have not
> tested it with Clang 4.0.
>
> diff --git a/tests/test-hash.c b/tests/test-hash.c
> index d1beead36ed5..f02f0218c71f 100644
> --- a/tests/test-hash.c
> +++ b/tests/test-hash.c
> @@ -153,14 +153,13 @@ check_hash_bytes128(void (*hash)(const void *, size_t, uint32_t, ovs_u128 *),
>          OVS_PACKED(struct offset_ovs_u128 {
>              uint32_t a;
>              ovs_u128 b;
> -        }) in0_data;
> -        ovs_u128 *in0, in1;
> +        }) in0;
> +        ovs_u128 in1;
>          ovs_u128 out0, out1;
>
> -        in0 = &in0_data.b;
> -        set_bit128(in0, i, n_bits);
>          set_bit128(&in1, i, n_bits);
> -        hash(in0, sizeof(ovs_u128), 0, &out0);
> +        in0.b = in1;
> +        hash(&in0.b, sizeof(ovs_u128), 0, &out0);
>          hash(&in1, sizeof(ovs_u128), 0, &out1);
>          if (!ovs_u128_equals(out0, out1)) {
>              printf("%s hash not the same for non-64 aligned data "

Thanks, this looks like a much better approach and it satisfies clang
4.0. Will you propose this formally or shall I? The 256B version needs
a slight variation on this as well.
Ben Pfaff May 25, 2017, 8:54 p.m. UTC | #2
On Thu, May 25, 2017 at 01:18:21PM -0700, Joe Stringer wrote:
> On 25 May 2017 at 10:42, Ben Pfaff <blp@ovn.org> wrote:
> > On Tue, May 23, 2017 at 04:02:15PM -0700, Joe Stringer wrote:
> >> Clang 4.0 complains:
> >>
> >> ../tests/test-hash.c:160:16: error: taking address of packed member 'b' of
> >> class or structure 'offset_ovs_u128' may result in an unaligned pointer value
> >>       [-Werror,-Waddress-of-packed-member]
> >>         in0 = &in0_data.b;
> >>
> >> Rework the 128-bit hash test to have a separate function for setting
> >> bits in the 32-bit offset u128 structure.
> >>
> >> Signed-off-by: Joe Stringer <joe@ovn.org>
> >
> > How about something like this, to reduce code duplication?  I have not
> > tested it with Clang 4.0.
> >
> > diff --git a/tests/test-hash.c b/tests/test-hash.c
> > index d1beead36ed5..f02f0218c71f 100644
> > --- a/tests/test-hash.c
> > +++ b/tests/test-hash.c
> > @@ -153,14 +153,13 @@ check_hash_bytes128(void (*hash)(const void *, size_t, uint32_t, ovs_u128 *),
> >          OVS_PACKED(struct offset_ovs_u128 {
> >              uint32_t a;
> >              ovs_u128 b;
> > -        }) in0_data;
> > -        ovs_u128 *in0, in1;
> > +        }) in0;
> > +        ovs_u128 in1;
> >          ovs_u128 out0, out1;
> >
> > -        in0 = &in0_data.b;
> > -        set_bit128(in0, i, n_bits);
> >          set_bit128(&in1, i, n_bits);
> > -        hash(in0, sizeof(ovs_u128), 0, &out0);
> > +        in0.b = in1;
> > +        hash(&in0.b, sizeof(ovs_u128), 0, &out0);
> >          hash(&in1, sizeof(ovs_u128), 0, &out1);
> >          if (!ovs_u128_equals(out0, out1)) {
> >              printf("%s hash not the same for non-64 aligned data "
> 
> Thanks, this looks like a much better approach and it satisfies clang
> 4.0. Will you propose this formally or shall I? The 256B version needs
> a slight variation on this as well.

I was hoping that you would propose it formally.
Joe Stringer May 25, 2017, 9:03 p.m. UTC | #3
On 25 May 2017 at 13:54, Ben Pfaff <blp@ovn.org> wrote:
> On Thu, May 25, 2017 at 01:18:21PM -0700, Joe Stringer wrote:
>> On 25 May 2017 at 10:42, Ben Pfaff <blp@ovn.org> wrote:
>> > On Tue, May 23, 2017 at 04:02:15PM -0700, Joe Stringer wrote:
>> >> Clang 4.0 complains:
>> >>
>> >> ../tests/test-hash.c:160:16: error: taking address of packed member 'b' of
>> >> class or structure 'offset_ovs_u128' may result in an unaligned pointer value
>> >>       [-Werror,-Waddress-of-packed-member]
>> >>         in0 = &in0_data.b;
>> >>
>> >> Rework the 128-bit hash test to have a separate function for setting
>> >> bits in the 32-bit offset u128 structure.
>> >>
>> >> Signed-off-by: Joe Stringer <joe@ovn.org>
>> >
>> > How about something like this, to reduce code duplication?  I have not
>> > tested it with Clang 4.0.
>> >
>> > diff --git a/tests/test-hash.c b/tests/test-hash.c
>> > index d1beead36ed5..f02f0218c71f 100644
>> > --- a/tests/test-hash.c
>> > +++ b/tests/test-hash.c
>> > @@ -153,14 +153,13 @@ check_hash_bytes128(void (*hash)(const void *, size_t, uint32_t, ovs_u128 *),
>> >          OVS_PACKED(struct offset_ovs_u128 {
>> >              uint32_t a;
>> >              ovs_u128 b;
>> > -        }) in0_data;
>> > -        ovs_u128 *in0, in1;
>> > +        }) in0;
>> > +        ovs_u128 in1;
>> >          ovs_u128 out0, out1;
>> >
>> > -        in0 = &in0_data.b;
>> > -        set_bit128(in0, i, n_bits);
>> >          set_bit128(&in1, i, n_bits);
>> > -        hash(in0, sizeof(ovs_u128), 0, &out0);
>> > +        in0.b = in1;
>> > +        hash(&in0.b, sizeof(ovs_u128), 0, &out0);
>> >          hash(&in1, sizeof(ovs_u128), 0, &out1);
>> >          if (!ovs_u128_equals(out0, out1)) {
>> >              printf("%s hash not the same for non-64 aligned data "
>>
>> Thanks, this looks like a much better approach and it satisfies clang
>> 4.0. Will you propose this formally or shall I? The 256B version needs
>> a slight variation on this as well.
>
> I was hoping that you would propose it formally.

OK, I can do that.
diff mbox

Patch

diff --git a/tests/test-hash.c b/tests/test-hash.c
index d1beead36ed5..f02f0218c71f 100644
--- a/tests/test-hash.c
+++ b/tests/test-hash.c
@@ -153,14 +153,13 @@  check_hash_bytes128(void (*hash)(const void *, size_t, uint32_t, ovs_u128 *),
         OVS_PACKED(struct offset_ovs_u128 {
             uint32_t a;
             ovs_u128 b;
-        }) in0_data;
-        ovs_u128 *in0, in1;
+        }) in0;
+        ovs_u128 in1;
         ovs_u128 out0, out1;
 
-        in0 = &in0_data.b;
-        set_bit128(in0, i, n_bits);
         set_bit128(&in1, i, n_bits);
-        hash(in0, sizeof(ovs_u128), 0, &out0);
+        in0.b = in1;
+        hash(&in0.b, sizeof(ovs_u128), 0, &out0);
         hash(&in1, sizeof(ovs_u128), 0, &out1);
         if (!ovs_u128_equals(out0, out1)) {
             printf("%s hash not the same for non-64 aligned data "