[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#8015) memcpy() overlapping in many places



> *
> Date: Sat, 03 Jan 2015 22:48:15 +0000
> From: Howard Chu <hyc@symas.com>
> To: kurt@OpenLDAP.org, openldap-its@OpenLDAP.org
> Subject: Re: (ITS#8015) memcpy() overlapping in many places
> *
> kurt@OpenLDAP.org wrote:
> > AC_MEMCPY is generally memove(3).  It would only be memcpy(3) if both =
> > memmove(3) or bcopy(3) were not available.  So at most your patch will =
> > cause link errors.
>
> Closing this ITS. The patch is obviously invalid.

I decided after all to answer regarding AC_MEMCPY as this illustrative 
case mess of the source code (aka rebus code style).
In my opinion it also illustrates the substitution of concepts in 
conversations about the quality of code and demonstrates the incorrect 
use of tools such as autconf.

If we look at the source code, you will see that there are three things 
that are relevant to the discussion:directly memmove(), directly 
memcpy() and macro AC_MEMCPY.
Simultaneous use directly memcpy() and AC_MEMCPY seems like a legacy 
effort for compatibility. Ok, this is not a problem, just a less of changes.

But in fact AC_MEMCPY used for overlapped source and destination, like a 
memmove().
Ok, as you noted, the AC_MEMCPY macro will be expanded to memmove(), 
therefore it is no problems with overlapped source and destination.
But then, why macro is really named as 'MEMCPY'?

However AC_MEMCPY will be _silently_ expanded to memcpy() if no 
memmove() or bcopy() is available!

What we have at the end?
- Completely unnecessary macro which is confusing because of the 
inappropriate name.
- The possibility of incorrect and quiet substitution macro that will 
lead to a wonderful unexpected errors.
- Misuse autoconf, which leads to the creation of compatibility issues, 
rather than overcome them.
This sort of thing I call "rebus code style" ;)

Leonid.