Date: Sat, 12 Sep 2009 12:41:43 +0200 From: Fabian Keil <freebsd-listen@fabiankeil.de> To: freebsd-questions@freebsd.org Subject: Re: c++: invalid conversion from 'int' to 'const char*' Message-ID: <20090912124143.2fb77924@r500.local> In-Reply-To: <53480375@bb.ipt.ru> References: <53480375@bb.ipt.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
--Sig_/WpX7GCjjFSCWRecuUCZyX20 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Boris Samorodov <bsam@ipt.ru> wrote: > I'm porting a c++ application to FreeBSD. I've got an error: > ----- > ~/work/src/FileChannel.cpp: In member function 'QString FileChannel::erro= rString()': > ~/work/src/FileChannel.cpp:251: error: invalid conversion from 'int' to '= const char*' > ~/work/src/FileChannel.cpp:251: error: initializing argument 2 of 'char= * strcpy(char*, const char*)' > *** Error code 1 > ----- >=20 > A simle patch makes the application to be compiled without errors: > ----- > --- src/FileChannel.cpp.orig 2009-09-12 13:08:28.000000000 +0400 > +++ src/FileChannel.cpp 2009-09-12 13:08:41.000000000 +0400 > @@ -248,7 +248,7 @@ > =20 > QString FileChannel::errorString() > { > - strcpy(lastErrorString, strerror_r(errno, lastErrorString, 0)); > + strcpy(lastErrorString, "XXX: Fix me: errno should be here"); > return QString(trUtf8(lastErrorString)); > } At least to me, this looks like a bug in the program you are porting. I don't see how this would work on other platforms either, unless the libc strerror_r() is shadowed which seems unlikely. I assume someone replaced strerror() with strerror_r() and missed the differences. The third argument of strerror_r() being zero looks strange, too. > If I understand correctly, an integer value which is returned by > strerror_r() should be converted to const char*. > > I have _very_ basic knowledge about c++. Hence my question. > Can someone provide a patch (a proof of concept)? Thanks! You could try replacing the strerror_r() call with strerror(errno). It wouldn't be thread-safe, but should at least work most of the time. If the application is threaded, a better fix would be not to use strcpy() at all. strerror_r() already puts the error description into the buffer, so there's no need to copy anything. To do this, you'd still need to fix the third argument, though. If lastErrorString is an array you could use sizeof(lastErrorString), if it's a pointer you could look for a malloc() call that allocates the buffer to figure out the size. Either way, you should probably report the problem upstream. Fabian --Sig_/WpX7GCjjFSCWRecuUCZyX20 Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.13 (FreeBSD) iEYEARECAAYFAkqreusACgkQBYqIVf93VJ2gGwCgymOxY2JMIipmzfIqNzk4ugDS XusAnRmuAOnSHB9SqjeG5U8ll2vRVMpL =IhPz -----END PGP SIGNATURE----- --Sig_/WpX7GCjjFSCWRecuUCZyX20--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090912124143.2fb77924>