diff options
-rw-r--r-- | changes/double-0-check | 8 | ||||
-rw-r--r-- | configure.ac | 24 | ||||
-rw-r--r-- | src/common/compat.h | 5 | ||||
-rw-r--r-- | src/win32/orconfig.h | 3 |
4 files changed, 40 insertions, 0 deletions
diff --git a/changes/double-0-check b/changes/double-0-check new file mode 100644 index 0000000000..74554cd272 --- /dev/null +++ b/changes/double-0-check @@ -0,0 +1,8 @@ + o Build improvements (bizarre platform detection): + - Try to detect it if we are ever building on a platform where + memset(...,0,...) does not set the value of a double to 0.0. Such + platforms are permitted by the C standard, though in practice + they're pretty rare (since IEEE 754 is nigh-ubiquitous). We don't + currently support them, but it's better to detect them and fail + than to perform erroneously. + diff --git a/configure.ac b/configure.ac index f047ab9027..6c4a0792fe 100644 --- a/configure.ac +++ b/configure.ac @@ -1033,6 +1033,30 @@ if test "$tor_cv_null_is_zero" != no; then [Define to 1 iff memset(0) sets pointers to NULL]) fi +AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero, +[AC_RUN_IFELSE([AC_LANG_SOURCE( +[[#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#ifdef HAVE_STDDEF_H +#include <stddef.h> +#endif +int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2)); +return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])], + [tor_cv_dbl0_is_zero=yes], + [tor_cv_dbl0_is_zero=no], + [tor_cv_dbl0_is_zero=cross])]) + +if test "$tor_cv_dbl0_is_zero" = cross ; then + # Cross-compiling; let's hope that the target isn't raving mad. + AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.]) +fi + +if test "$tor_cv_dbl0_is_zero" != no; then + AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1, + [Define to 1 iff memset(0) sets doubles to 0.0]) +fi + # And what happens when we malloc zero? AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works, [AC_RUN_IFELSE([AC_LANG_SOURCE( diff --git a/src/common/compat.h b/src/common/compat.h index 25293a4ed6..b036419718 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -74,6 +74,11 @@ #error "It seems your platform does not represent NULL as zero. We can't cope." #endif +#ifndef DOUBLE_0_REP_IS_ZERO_BYTES +#error "It seems your platform does not represent 0.0 as zeros. We can't cope." +#endif + + #if 'a'!=97 || 'z'!=122 || 'A'!=65 || ' '!=32 #error "It seems that you encode characters in something other than ASCII." #endif diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h index 6e45a2928b..ef08fdb2be 100644 --- a/src/win32/orconfig.h +++ b/src/win32/orconfig.h @@ -151,6 +151,9 @@ /* Define to 1 iff NULL is represented by a 0 in memory. */ #define NULL_REP_IS_ZERO_BYTES 1 +/* Define to 1 iff memset(0) sets doubles to 0.0 */ +#define DOUBLE_0_REP_IS_ZERO_BYTES 1 + /* Name of package */ #define PACKAGE "tor" |