Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compile fails with -DPERL_HASH_FUNC_SIPHASH13 on GCC7.3 : static declaration of ‘S_perl_siphash_seed_state’ follows non-static declaration #16471

Closed
p5pRT opened this issue Mar 19, 2018 · 6 comments · Fixed by #17846
Assignees

Comments

@p5pRT
Copy link

p5pRT commented Mar 19, 2018

Migrated from rt.perl.org#132999 (status was 'open')

Searchable as RT132999$

@p5pRT
Copy link
Author

p5pRT commented Mar 19, 2018

From @kentfredric

Created by @kentfredric

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.

Perl Info

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

@p5pRT
Copy link
Author

p5pRT commented Mar 19, 2018

From @kentfredric

build.perl-5.27.9.log

@p5pRT
Copy link
Author

p5pRT commented Mar 28, 2018

From @tonycoz

On Sun, 18 Mar 2018 19​:19​:05 -0700, kentfredric@​gmail.com wrote​:

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

@p5pRT
Copy link
Author

p5pRT commented Mar 28, 2018

From @tonycoz

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

@p5pRT
Copy link
Author

p5pRT commented Mar 28, 2018

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Apr 20, 2019

From @khwilliamson

If the OP doesn't reply, I think we should move this to stalled, or go ahead and apply the patch
--
Karl Williamson

@toddr toddr removed the khw label Oct 25, 2019
@tonycoz tonycoz self-assigned this Jun 7, 2020
tonycoz added a commit to tonycoz/perl5 that referenced this issue Jun 8, 2020
tonycoz added a commit to tonycoz/perl5 that referenced this issue Jun 8, 2020
tonycoz added a commit to tonycoz/perl5 that referenced this issue Jun 15, 2020
tonycoz added a commit to tonycoz/perl5 that referenced this issue Aug 4, 2020
tonycoz added a commit that referenced this issue Aug 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants