Skip Menu |
Report information
Id: 132999
Status: open
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: kentfredric [at] gmail.com
Cc:
AdminCc:

Operating System: (no value)
PatchStatus: (no value)
Severity: medium
Type: install
Perl Version: 5.27.9
Fixed In: (no value)



Date: Mon, 19 Mar 2018 15:18:28 +1300
From: Kent Fredric <kentfredric [...] gmail.com>
Subject: Compile fails with -DPERL_HASH_FUNC_SIPHASH13 on GCC7.3 : static declaration of ‘S_perl_siphash_seed_state’ follows non-static declaration
To: perlbug [...] perl.org
Download (untitled) / with headers
text/plain 4.8k
This is a bug report for perl from kentnl@cpan.org, generated with the help of perlbug 1.41 running under perl 5.27.9. ----------------------------------------------------------------- [Please describe your issue here] At least on GCC 7.3, Perl 5.27.9 Fails compile with -DPERL_HASH_FUNC_SIPHASH13, with the errors: hv_func.h:194:6: error: static declaration of ‘S_perl_siphash_seed_state’ follows non-static declaration hv_func.h:260:5: error: conflicting types for ‘S_perl_hash_siphash_1_3_with_state’ S_perl_hash_siphash_1_3 ^ Shown site configuration data is from 5.27.9 with identical flags except for -DPERL_HASH_FUNC_SIPHASH13, which compiles successfully. Complete failing build log attached. [Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=install severity=medium --- Site configuration information for perl 5.27.9: Configured by kent at Mon Mar 19 14:33:34 NZDT 2018. Summary of my perl5 (revision 5 version 27 subversion 9) configuration: Platform: osname=linux osvers=4.10.13-gentoo archname=x86_64-linux uname='linux katipo2 4.10.13-gentoo #48 smp preempt tue may 2 15:18:23 nzst 2017 x86_64 intel(r) core(tm) i5-2410m cpu @ 2.30ghz genuineintel gnulinux ' config_args='-de -Dprefix=/home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot -Ddefault_inc_excludes_dot -Doptimize= -fstack-protector-strong -fno-stack-protector -O3 -march=native -mtune=native -Dman1dir=none -Dman3dir=none -Dusedevel -Accflags= -fstack-protector-strong -fno-stack-protector -DPERL_DISABLE_PMC -Aldflags= -fstack-protector-strong -fno-stack-protector -Aeval:scriptdir=/home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/bin' hint=recommended useposix=true d_sigaction=define useithreads=undef usemultiplicity=undef use64bitint=define use64bitall=define uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='cc' ccflags ='-fstack-protector-strong -fno-stack-protector -DPERL_DISABLE_PMC -fwrapv -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' optimize=' -fstack-protector-strong -fno-stack-protector -O3 -march=native -mtune=native' cppflags='-fstack-protector-strong -fno-stack-protector -DPERL_DISABLE_PMC -fwrapv -fno-strict-aliasing -pipe' ccversion='' gccversion='7.3.0' gccosandvers='' intsize=4 longsize=8 ptrsize=8 doublesize=8 byteorder=12345678 doublekind=3 d_longlong=define longlongsize=8 d_longdbl=define longdblsize=16 longdblkind=3 ivtype='long' ivsize=8 nvtype='double' nvsize=8 Off_t='off_t' lseeksize=8 alignbytes=8 prototype=define Linker and Libraries: ld='cc' ldflags =' -fstack-protector-strong -fno-stack-protector -L/usr/local/lib' libpth=/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include-fixed /usr/lib /usr/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64 libs=-lpthread -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat perllibs=-lpthread -ldl -lm -lcrypt -lutil -lc libc=libc-2.26.so so=so useshrplib=false libperl=libperl.a gnulibc_version='2.26' Dynamic Linking: dlsrc=dl_dlopen.xs dlext=so d_dlsymun=undef ccdlflags='-Wl,-E' cccdlflags='-fPIC' lddlflags='-shared -fstack-protector-strong -fno-stack-protector -O3 -march=native -mtune=native -L/usr/local/lib' --- @INC for perl 5.27.9: /home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/lib/site_perl/5.27.9/x86_64-linux /home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/lib/site_perl/5.27.9 /home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/lib/5.27.9/x86_64-linux /home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/lib/5.27.9 --- Environment for perl 5.27.9: HOME=/home/kent LANG=en_NZ.UTF8 LANGUAGE (unset) LC_CTYPE=en_NZ.UTF8 LC_TIME=en_NZ.UTF8 LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/kent/perl5/perlbrew/bin:/home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/bin:/home/kent/.rvm/gems/ruby-2.1.2/bin:/home/kent/.rvm/gems/ruby-2.1.2@global/bin:/home/kent/.rvm/rubies/ruby-2.1.2/bin:/home/kent/.perl6/2013.04/bin:/home/kent/.gem/ruby/1.8/bin/:/usr/x86_64-pc-linux-gnu/gcc-bin/6.4.0:/usr/lib/llvm/5/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin:/home/kent/.rvm/bin:/home/kent/.rvm/bin PERLBREW_BASHRC_VERSION=0.80 PERLBREW_HOME=/home/kent/.perlbrew PERLBREW_MANPATH=/home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/man PERLBREW_PATH=/home/kent/perl5/perlbrew/bin:/home/kent/perl5/perlbrew/perls/5.27.9-nossp-oaath-nopmc-nodot/bin PERLBREW_PERL=5.27.9-nossp-oaath-nopmc-nodot PERLBREW_ROOT=/home/kent/perl5/perlbrew PERLBREW_VERSION=0.80 PERL_BADLANG (unset) SHELL=/bin/bash
Download build.perl-5.27.9.log
text/x-log 103.5k

Message body is not shown because sender requested not to inline it.

RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 585b
On Sun, 18 Mar 2018 19:19:05 -0700, kentfredric@gmail.com wrote: Show quoted text
> At least on GCC 7.3, Perl 5.27.9 Fails compile with > -DPERL_HASH_FUNC_SIPHASH13, with the errors: > > hv_func.h:194:6: error: static declaration of > ‘S_perl_siphash_seed_state’ follows non-static declaration > hv_func.h:260:5: error: conflicting types for > ‘S_perl_hash_siphash_1_3_with_state’ > S_perl_hash_siphash_1_3 > ^ > > Shown site configuration data is from 5.27.9 with identical flags > except for -DPERL_HASH_FUNC_SIPHASH13, which compiles successfully.
Please try the attached patch. Tony
Subject: 0001-perl-132999-ensure-siphash-functions-are-declared-be.patch
From 331cdf7f4ef7b46e3255b99220575919febffa6e Mon Sep 17 00:00:00 2001 From: Tony Cook <tony@develop-help.com> Date: Wed, 28 Mar 2018 11:53:09 +1100 Subject: [PATCH] (perl #132999) ensure siphash functions are declared before use I considered moving only the parts that depend on these functions after the siphash block, but that's a little fragile. Rather than that, I made the siphash code match the other hash functions, moving the siphash specific code into its own header. This also make hv_func.h more focused, so it's only dealing with the infrastructure needed to give all the hashes the same interface. --- MANIFEST | 1 + hv_func.h | 117 ++------------------------------------------------------------ siphash.h | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 115 deletions(-) create mode 100644 siphash.h diff --git a/MANIFEST b/MANIFEST index 235689d946..be7916f84b 100644 --- a/MANIFEST +++ b/MANIFEST @@ -5344,6 +5344,7 @@ runtests.SH A script that generates runtests sbox32_hash.h SBox hash code (32 Bit SBOX based hash function) scope.c Scope entry and exit code scope.h Scope entry and exit header +siphash.h Siphash hash code stadtx_hash.h StadtX hash code (64 Bit fast hash function) sv.c Scalar value code sv.h Scalar value header diff --git a/hv_func.h b/hv_func.h index 111de93f1e..098d96b1e4 100644 --- a/hv_func.h +++ b/hv_func.h @@ -40,12 +40,14 @@ # define __PERL_HASH_STATE_BYTES 32 # define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) # define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len)) +#include "siphash.h" #elif defined(PERL_HASH_FUNC_SIPHASH13) # define __PERL_HASH_FUNC "SIPHASH_1_3" # define __PERL_HASH_SEED_BYTES 16 # define __PERL_HASH_STATE_BYTES 32 # define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) # define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(U8*)(str),(len)) +#include "siphash.h" #elif defined(PERL_HASH_FUNC_STADTX) # define __PERL_HASH_FUNC "STATDX" # define __PERL_HASH_SEED_BYTES 16 @@ -155,121 +157,6 @@ U32 S_perl_hash_with_seed(const U8 * const seed, const U8 * const str, const STR #define PERL_HASH_INTERNAL(hash,str,len) PERL_HASH(hash,str,len) #endif -/* This is SipHash by Jean-Philippe Aumasson and Daniel J. Bernstein. - * The authors claim it is relatively secure compared to the alternatives - * and that performance wise it is a suitable hash for languages like Perl. - * See: - * - * https://www.131002.net/siphash/ - * - * This implementation seems to perform slightly slower than one-at-a-time for - * short keys, but degrades slower for longer keys. Murmur Hash outperforms it - * regardless of keys size. - * - * It is 64 bit only. - */ - -#ifdef CAN64BITHASH - -#define SIPROUND \ - STMT_START { \ - v0 += v1; v1=ROTL64(v1,13); v1 ^= v0; v0=ROTL64(v0,32); \ - v2 += v3; v3=ROTL64(v3,16); v3 ^= v2; \ - v0 += v3; v3=ROTL64(v3,21); v3 ^= v0; \ - v2 += v1; v1=ROTL64(v1,17); v1 ^= v2; v2=ROTL64(v2,32); \ - } STMT_END - -#define SIPHASH_SEED_STATE(key,v0,v1,v2,v3) \ -do { \ - v0 = v2 = U8TO64_LE(key + 0); \ - v1 = v3 = U8TO64_LE(key + 8); \ - /* "somepseudorandomlygeneratedbytes" */ \ - v0 ^= UINT64_C(0x736f6d6570736575); \ - v1 ^= UINT64_C(0x646f72616e646f6d); \ - v2 ^= UINT64_C(0x6c7967656e657261); \ - v3 ^= UINT64_C(0x7465646279746573); \ -} while (0) - -PERL_STATIC_INLINE -void S_perl_siphash_seed_state(const unsigned char * const seed_buf, unsigned char * state_buf) { - U64 *v= (U64*) state_buf; - SIPHASH_SEED_STATE(seed_buf, v[0],v[1],v[2],v[3]); -} - -#define PERL_SIPHASH_FNC(FNC,SIP_ROUNDS,SIP_FINAL_ROUNDS) \ -PERL_STATIC_INLINE U32 \ -FNC ## _with_state \ - (const unsigned char * const state, const unsigned char *in, const STRLEN inlen) \ -{ \ - const int left = inlen & 7; \ - const U8 *end = in + inlen - left; \ - \ - U64 b = ( ( U64 )(inlen) ) << 56; \ - U64 m; \ - U64 v0 = U8TO64_LE(state); \ - U64 v1 = U8TO64_LE(state+8); \ - U64 v2 = U8TO64_LE(state+16); \ - U64 v3 = U8TO64_LE(state+24); \ - \ - for ( ; in != end; in += 8 ) \ - { \ - m = U8TO64_LE( in ); \ - v3 ^= m; \ - \ - SIP_ROUNDS; \ - \ - v0 ^= m; \ - } \ - \ - switch( left ) \ - { \ - case 7: b |= ( ( U64 )in[ 6] ) << 48; \ - case 6: b |= ( ( U64 )in[ 5] ) << 40; \ - case 5: b |= ( ( U64 )in[ 4] ) << 32; \ - case 4: b |= ( ( U64 )in[ 3] ) << 24; \ - case 3: b |= ( ( U64 )in[ 2] ) << 16; \ - case 2: b |= ( ( U64 )in[ 1] ) << 8; \ - case 1: b |= ( ( U64 )in[ 0] ); break; \ - case 0: break; \ - } \ - \ - v3 ^= b; \ - \ - SIP_ROUNDS; \ - \ - v0 ^= b; \ - \ - v2 ^= 0xff; \ - \ - SIP_FINAL_ROUNDS \ - \ - b = v0 ^ v1 ^ v2 ^ v3; \ - return (U32)(b & U32_MAX); \ -} \ - \ -PERL_STATIC_INLINE U32 \ -FNC (const unsigned char * const seed, const unsigned char *in, const STRLEN inlen) \ -{ \ - U64 state[4]; \ - SIPHASH_SEED_STATE(seed,state[0],state[1],state[2],state[3]); \ - return FNC ## _with_state((U8*)state,in,inlen); \ -} - - -PERL_SIPHASH_FNC( - S_perl_hash_siphash_1_3 - ,SIPROUND; - ,SIPROUND;SIPROUND;SIPROUND; -) - -PERL_SIPHASH_FNC( - S_perl_hash_siphash_2_4 - ,SIPROUND;SIPROUND; - ,SIPROUND;SIPROUND;SIPROUND;SIPROUND; -) -#endif /* defined(CAN64BITHASH) */ - - #endif /*compile once*/ /* diff --git a/siphash.h b/siphash.h new file mode 100644 index 0000000000..10abb939cc --- /dev/null +++ b/siphash.h @@ -0,0 +1,114 @@ +/* This is SipHash by Jean-Philippe Aumasson and Daniel J. Bernstein. + * The authors claim it is relatively secure compared to the alternatives + * and that performance wise it is a suitable hash for languages like Perl. + * See: + * + * https://www.131002.net/siphash/ + * + * This implementation seems to perform slightly slower than one-at-a-time for + * short keys, but degrades slower for longer keys. Murmur Hash outperforms it + * regardless of keys size. + * + * It is 64 bit only. + */ + +#ifdef CAN64BITHASH + +#define SIPROUND \ + STMT_START { \ + v0 += v1; v1=ROTL64(v1,13); v1 ^= v0; v0=ROTL64(v0,32); \ + v2 += v3; v3=ROTL64(v3,16); v3 ^= v2; \ + v0 += v3; v3=ROTL64(v3,21); v3 ^= v0; \ + v2 += v1; v1=ROTL64(v1,17); v1 ^= v2; v2=ROTL64(v2,32); \ + } STMT_END + +#define SIPHASH_SEED_STATE(key,v0,v1,v2,v3) \ +do { \ + v0 = v2 = U8TO64_LE(key + 0); \ + v1 = v3 = U8TO64_LE(key + 8); \ + /* "somepseudorandomlygeneratedbytes" */ \ + v0 ^= UINT64_C(0x736f6d6570736575); \ + v1 ^= UINT64_C(0x646f72616e646f6d); \ + v2 ^= UINT64_C(0x6c7967656e657261); \ + v3 ^= UINT64_C(0x7465646279746573); \ +} while (0) + +PERL_STATIC_INLINE +void S_perl_siphash_seed_state(const unsigned char * const seed_buf, unsigned char * state_buf) { + U64 *v= (U64*) state_buf; + SIPHASH_SEED_STATE(seed_buf, v[0],v[1],v[2],v[3]); +} + +#define PERL_SIPHASH_FNC(FNC,SIP_ROUNDS,SIP_FINAL_ROUNDS) \ +PERL_STATIC_INLINE U32 \ +FNC ## _with_state \ + (const unsigned char * const state, const unsigned char *in, const STRLEN inlen) \ +{ \ + const int left = inlen & 7; \ + const U8 *end = in + inlen - left; \ + \ + U64 b = ( ( U64 )(inlen) ) << 56; \ + U64 m; \ + U64 v0 = U8TO64_LE(state); \ + U64 v1 = U8TO64_LE(state+8); \ + U64 v2 = U8TO64_LE(state+16); \ + U64 v3 = U8TO64_LE(state+24); \ + \ + for ( ; in != end; in += 8 ) \ + { \ + m = U8TO64_LE( in ); \ + v3 ^= m; \ + \ + SIP_ROUNDS; \ + \ + v0 ^= m; \ + } \ + \ + switch( left ) \ + { \ + case 7: b |= ( ( U64 )in[ 6] ) << 48; \ + case 6: b |= ( ( U64 )in[ 5] ) << 40; \ + case 5: b |= ( ( U64 )in[ 4] ) << 32; \ + case 4: b |= ( ( U64 )in[ 3] ) << 24; \ + case 3: b |= ( ( U64 )in[ 2] ) << 16; \ + case 2: b |= ( ( U64 )in[ 1] ) << 8; \ + case 1: b |= ( ( U64 )in[ 0] ); break; \ + case 0: break; \ + } \ + \ + v3 ^= b; \ + \ + SIP_ROUNDS; \ + \ + v0 ^= b; \ + \ + v2 ^= 0xff; \ + \ + SIP_FINAL_ROUNDS \ + \ + b = v0 ^ v1 ^ v2 ^ v3; \ + return (U32)(b & U32_MAX); \ +} \ + \ +PERL_STATIC_INLINE U32 \ +FNC (const unsigned char * const seed, const unsigned char *in, const STRLEN inlen) \ +{ \ + U64 state[4]; \ + SIPHASH_SEED_STATE(seed,state[0],state[1],state[2],state[3]); \ + return FNC ## _with_state((U8*)state,in,inlen); \ +} + + +PERL_SIPHASH_FNC( + S_perl_hash_siphash_1_3 + ,SIPROUND; + ,SIPROUND;SIPROUND;SIPROUND; +) + +PERL_SIPHASH_FNC( + S_perl_hash_siphash_2_4 + ,SIPROUND;SIPROUND; + ,SIPROUND;SIPROUND;SIPROUND;SIPROUND; +) +#endif /* defined(CAN64BITHASH) */ + -- 2.11.0


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org