aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-01-29 17:38:15 -0500
committerNick Mathewson <nickm@torproject.org>2013-01-29 17:38:15 -0500
commit73d605b0f759a2ff9f859f78f76098dcdb290d37 (patch)
tree6293cd558c73359e726a40c8d6157af08be7cd35
parenta0351311aeea715cea24e156e065b65cc29a804c (diff)
downloadtor-73d605b0f759a2ff9f859f78f76098dcdb290d37.tar
tor-73d605b0f759a2ff9f859f78f76098dcdb290d37.tar.gz
Detect platforms where memset(0) doesn't set doubles to 0.0.
This is allowed by the C statndard, which permits you to represent doubles any way you like, but in practice we have some code that assumes that memset() clears doubles in structs. Noticed as part of 7802 review; see 8081 for more info.
-rw-r--r--changes/double-0-check8
-rw-r--r--configure.ac24
-rw-r--r--src/common/compat.h5
-rw-r--r--src/win32/orconfig.h3
4 files changed, 40 insertions, 0 deletions
diff --git a/changes/double-0-check b/changes/double-0-check
new file mode 100644
index 000000000..74554cd27
--- /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 f047ab902..6c4a0792f 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 25293a4ed..b03641971 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 6e45a2928..ef08fdb2b 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"