This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don't look for a "safe" memcpy()
authorAaron Crane <arc@cpan.org>
Thu, 12 Oct 2017 11:47:22 +0000 (13:47 +0200)
committerAaron Crane <arc@cpan.org>
Sat, 21 Oct 2017 15:51:21 +0000 (16:51 +0100)
C89 says that, if you want to copy overlapping memory blocks, you must use
memmove(), and that attempt to copy overlapping memory blocks using memcpy()
yields undefined behaviour. So we should never even attempt to probe for a
system memcpy() implementation that just happens to handle overlapping
memory blocks. In particular, the compiler might compile the probe program
in such a way that Configure thinks overlapping memcpy() works even when it
doesn't.

This has the additional advantage of removing a Configure probe that needs
to execute a target-platform program on the build host.

28 files changed:
Configure
Cross/config.sh-arm-linux
Cross/config.sh-arm-linux-n770
NetWare/config.wc
NetWare/config_H.wc
Porting/Glossary
Porting/config.sh
Porting/config_H
config_h.SH
configure.com
embed.fnc
embed.h
perl.h
plan9/config.plan9
plan9/config_h.sample
plan9/config_sh.sample
proto.h
symbian/config.sh
uconfig.h
uconfig.sh
uconfig64.sh
util.c
win32/config.ce
win32/config.gc
win32/config.vc
win32/config_H.ce
win32/config_H.gc
win32/config_H.vc

index 0c50aec..6739e8b 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -747,7 +747,6 @@ d_rint=''
 d_rmdir=''
 d_round=''
 d_safebcpy=''
-d_safemcpy=''
 d_sanemcmp=''
 d_sbrkproto=''
 d_scalbn=''
@@ -17990,82 +17989,6 @@ esac
 set d_safebcpy
 eval $setvar
 
-: can memcpy handle overlapping blocks?
-echo " "
-val="$undef"
-case "$d_memmove" in
-"$define") echo "I'll use memmove() instead of memcpy() for overlapping copies." ;;
-*)     case "$d_memcpy" in
-       "$define")
-               echo "Checking to see if memcpy() can do overlapping copies..." >&4
-               $cat >try.c <<EOCP
-#$i_memory I_MEMORY
-#$i_stdlib I_STDLIB
-#$i_string I_STRING
-#$i_unistd I_UNISTD
-EOCP
-       $cat >>try.c <<'EOCP'
-#include <stdio.h>
-#ifdef I_MEMORY
-#  include <memory.h>
-#endif
-#ifdef I_STDLIB
-#  include <stdlib.h>
-#endif
-#ifdef I_STRING
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#ifdef I_UNISTD
-#  include <unistd.h>  /* Needed for NetBSD */
-#endif
-int main()
-{
-char buf[128], abc[128];
-char *b;
-int len;
-int off;
-int align;
-
-/* Copy "abcde..." string to char abc[] so that gcc doesn't
-   try to store the string in read-only memory. */
-memcpy(abc, "abcdefghijklmnopqrstuvwxyz0123456789", 36);
-
-for (align = 7; align >= 0; align--) {
-       for (len = 36; len; len--) {
-               b = buf+align;
-               memcpy(b, abc, len);
-               for (off = 1; off <= len; off++) {
-                       memcpy(b+off, b, len);
-                       memcpy(b, b+off, len);
-                       if (memcmp(b, abc, len))
-                               exit(1);
-               }
-       }
-}
-exit(0);
-}
-EOCP
-               set try
-               if eval $compile_ok; then
-                       if $run ./try 2>/dev/null; then
-                               echo "Yes, it can."
-                               val="$define"
-                       else
-                               echo "It can't, sorry."
-                       fi
-               else
-                       echo "(I can't compile the test program, so we'll assume not...)"
-               fi
-               ;;
-       esac
-       $rm_try
-       ;;
-esac
-set d_safemcpy
-eval $setvar
-
 : can memcmp be trusted to compare relative magnitude?
 val="$undef"
 case "$d_memcmp" in
@@ -25033,7 +24956,6 @@ d_rint='$d_rint'
 d_rmdir='$d_rmdir'
 d_round='$d_round'
 d_safebcpy='$d_safebcpy'
-d_safemcpy='$d_safemcpy'
 d_sanemcmp='$d_sanemcmp'
 d_sbrkproto='$d_sbrkproto'
 d_scalbn='$d_scalbn'
index e3e3f81..76ceb0f 100644 (file)
@@ -473,7 +473,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='define'
 d_scalbn='undef'
index c22c7f1..2c6ce0b 100644 (file)
@@ -367,7 +367,6 @@ d_rename='define'
 d_rewinddir='define'
 d_rmdir='define'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='define'
 d_scalbnl='define'
index 714e415..be38eee 100644 (file)
@@ -462,7 +462,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='undef'
 d_scalbn='undef'
index 1317f63..391f468 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       /**/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks. Otherwise you should
- *     probably use memmove() or memcpy(). If neither is defined, roll your
- *     own version.
- */
-/*#define HAS_SAFE_MEMCPY      /**/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index 07fb8a9..bf515d2 100644 (file)
@@ -2171,11 +2171,6 @@ d_safebcpy (d_safebcpy.U):
        the bcopy() routine can do overlapping copies.  Normally, you
        should probably use memmove().
 
-d_safemcpy (d_safemcpy.U):
-       This variable conditionally defines the HAS_SAFE_MEMCPY symbol if
-       the memcpy() routine can do overlapping copies.
-       For overlapping copies, memmove() should be used, if available.
-
 d_sanemcmp (d_sanemcmp.U):
        This variable conditionally defines the HAS_SANE_MEMCMP symbol if
        the memcpy() routine is available and can be used to compare relative
index 57adadd..d1eeba2 100644 (file)
@@ -485,7 +485,6 @@ d_rint='define'
 d_rmdir='define'
 d_round='define'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='define'
 d_scalbn='define'
index 876a58e..59ff562 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       / **/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      / **/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index 8c86772..64392eb 100755 (executable)
@@ -1119,14 +1119,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_safebcpy HAS_SAFE_BCOPY    /**/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-#$d_safemcpy HAS_SAFE_MEMCPY   /**/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index c540a7a..23d9951 100644 (file)
@@ -6311,7 +6311,6 @@ $ WC "d_rint='" + d_rint + "'"
 $ WC "d_rmdir='define'"
 $ WC "d_round='undef'"
 $ WC "d_safebcpy='undef'"
-$ WC "d_safemcpy='define'"
 $ WC "d_sanemcmp='define'"
 $ WC "d_sbrkproto='define'"
 $ WC "d_scalbn='undef'"
index 279f1cb..4144242 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1055,7 +1055,7 @@ s |void   |move_proto_attr|NN OP **proto|NN OP **attrs \
 p      |int    |mode_from_discipline|NULLOK const char* s|STRLEN len
 Ap     |const char*    |moreswitches   |NN const char* s
 Ap     |NV     |my_atof        |NN const char *s
-#if !defined(HAS_MEMCPY) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY))
+#if !defined(HAS_MEMCPY) || !defined(HAS_MEMMOVE)
 Anp    |void*  |my_bcopy       |NN const void* vfrom|NN void* vto|size_t len
 #endif
 Apr    |void   |my_exit        |U32 status
diff --git a/embed.h b/embed.h
index 5273668..121b142 100644 (file)
--- a/embed.h
+++ b/embed.h
 #if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
 #define my_memcmp              Perl_my_memcmp
 #endif
-#if !defined(HAS_MEMCPY) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY))
+#if !defined(HAS_MEMCPY) || !defined(HAS_MEMMOVE)
 #define my_bcopy               Perl_my_bcopy
 #endif
 #if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
diff --git a/perl.h b/perl.h
index 40a6094..2cdcf1f 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1014,11 +1014,7 @@ EXTERN_C int usleep(unsigned int);
 #endif /* HAS_MEMCPY */
 
 #if !defined(HAS_MEMMOVE) && !defined(memmove)
-#   if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
-#      define memmove(d,s,l) memcpy(d,s,l)
-#   else
-#      define memmove(d,s,l) my_bcopy(s,d,l)
-#   endif
+#   define memmove(d,s,l) my_bcopy(s,d,l)
 #endif
 
 #if defined(mips) && defined(ultrix) && !defined(__STDC__)
index ec471db..81854e8 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       / **/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      / **/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index 5baf054..98811d4 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       / **/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      / **/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index ecf02fe..fabf84c 100644 (file)
@@ -473,7 +473,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='undef'
 d_scalbn='undef'
diff --git a/proto.h b/proto.h
index b004723..f0bfef1 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -3835,7 +3835,7 @@ PERL_CALLCONV int Perl_my_memcmp(const void* vs1, const void* vs2, size_t len)
        assert(vs1); assert(vs2)
 
 #endif
-#if !defined(HAS_MEMCPY) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY))
+#if !defined(HAS_MEMCPY) || !defined(HAS_MEMMOVE)
 PERL_CALLCONV void*    Perl_my_bcopy(const void* vfrom, void* vto, size_t len);
 #define PERL_ARGS_ASSERT_MY_BCOPY      \
        assert(vfrom); assert(vto)
index f798c1a..e50a021 100644 (file)
@@ -419,7 +419,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='undef'
 d_sbrkproto='undef'
 d_scalbn='undef'
index d4341e4..6684710 100644 (file)
--- a/uconfig.h
+++ b/uconfig.h
  */
 /*#define HAS_SAFE_BCOPY       / **/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      / **/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
 #endif
 
 /* Generated from:
- * 7ff89cdb1fe8ce0204ce7e895ef3799d115d4e499f4b93f639ab96b64a63d57e config_h.SH
- * bd4d12ab7495a044625abc3e1128f6939bdb50a02a59ae3a1b8bf64433002191 uconfig.sh
+ * d9687e4eb62ebccd02be4a08612dc1bcfd95119f0008203aee08f29c997ebfc3 config_h.SH
+ * 4fb77492d82d8e37400b5d34c71f1c2489d5dc04e82e61ec78998af0fdd60d99 uconfig.sh
  * ex: set ro: */
index ae319aa..04e65ec 100644 (file)
@@ -412,7 +412,6 @@ d_rint='undef'
 d_rmdir='undef'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='undef'
 d_sbrkproto='undef'
 d_scalbn='undef'
index e044c81..fb9c556 100644 (file)
@@ -413,7 +413,6 @@ d_rint='undef'
 d_rmdir='undef'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='undef'
 d_sbrkproto='undef'
 d_scalbn='undef'
diff --git a/util.c b/util.c
index d2659b4..53fcf17 100644 (file)
--- a/util.c
+++ b/util.c
@@ -2225,7 +2225,7 @@ Perl_unlnk(pTHX_ const char *f)   /* unlink all versions of a file */
 
 /* this is a drop-in replacement for bcopy(), except for the return
  * value, which we need to be able to emulate memcpy()  */
-#if !defined(HAS_MEMCPY) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY))
+#if !defined(HAS_MEMCPY) || !defined(HAS_MEMMOVE)
 void *
 Perl_my_bcopy(const void *vfrom, void *vto, size_t len)
 {
index 6b26210..3db9824 100644 (file)
@@ -460,7 +460,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='undef'
 d_scalbn='undef'
index 8863d11..58882d9 100644 (file)
@@ -461,7 +461,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='undef'
 d_scalbn='undef'
index e73cfbe..dde3954 100644 (file)
@@ -461,7 +461,6 @@ d_rint='undef'
 d_rmdir='define'
 d_round='undef'
 d_safebcpy='undef'
-d_safemcpy='undef'
 d_sanemcmp='define'
 d_sbrkproto='undef'
 d_scalbn='undef'
index 9ee004c..9aada6e 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       /**/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      /**/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index 08b719c..3de8267 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       / **/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      / **/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high
index a8f1f11..c3e17a2 100644 (file)
  */
 /*#define HAS_SAFE_BCOPY       / **/
 
-/* HAS_SAFE_MEMCPY:
- *     This symbol, if defined, indicates that the memcpy routine is available
- *     to copy potentially overlapping memory blocks.  If you need to
- *     copy overlapping memory blocks, you should check HAS_MEMMOVE and
- *     use memmove() instead, if available.
- */
-/*#define HAS_SAFE_MEMCPY      / **/
-
 /* HAS_SANE_MEMCMP:
  *     This symbol, if defined, indicates that the memcmp routine is available
  *     and can be used to compare relative magnitudes of chars with their high