strerror: make C++ safe
(too old to reply)
Bruno Haible
2016-11-19 13:09:46 UTC
Raw Message
When creating a gnulib testdir for module 'strerror'
./gnulib-tool --create-testdir --with-c++-tests --with-tests --dir=... strerror
and forcing REPLACE_STRERROR=1, the compilation in C++ mode with GNULIB_NAMESPACE

$ ./configure CPPFLAGS="-DGNULIB_NAMESPACE=gggg -Wall" CC=g++
$ make
g++ -DHAVE_CONFIG_H -I. -I.. -DGNULIB_STRICT_CHECKING=1 -DGNULIB_NAMESPACE=gggg -Wall -g -O2 -MT strerror.o -MD -MP -MF .deps/strerror.Tpo -c -o strerror.o strerror.c
strerror.c: In function 'char* rpl_strerror(int)':
strerror.c:70:35: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
make[4]: *** [strerror.o] Error 1

The reason is that memcpy() returns a 'void *'. But we want a 'char *' here.
Rather than introduce a cast, simply use the known return value of memcpy().

I'm pushing this fix:

2016-11-19 Bruno Haible <***@clisp.org>

strerror: Make it compile in C++ mode.
* lib/strerror.c (strerror): Ignore the return value of memcpy().

--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -66,5 +66,6 @@ strerror (int n)
if (sizeof buf <= len)
abort ();

- return memcpy (buf, msg, len + 1);
+ memcpy (buf, msg, len + 1);
+ return buf;