svn commit: r285644 - head/contrib/sqlite3
Dimitry Andric
dim at FreeBSD.org
Sat Jul 18 22:46:47 UTC 2015
On 18 Jul 2015, at 00:53, Pedro Giffuni <pfg at freebsd.org> wrote:
>
> On 07/17/15 17:26, Peter Jeremy wrote:
>> On 2015-Jul-16 22:07:14 +0000, "Pedro F. Giffuni" <pfg at FreeBSD.org> wrote:
>>> Log:
>> ...
>>> sqlite: clean a couple of invocations of memcpy(3)
>>> Found almost accidentally by our native gcc when enhanced with
>>> FORTIFY_SOURCE.
>> ...
>>> - memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
>>> + memcpy((void *)&aHdr[1], (const void *)&pWal->hdr, sizeof(WalIndexHdr));
>>> walShmBarrier(pWal);
>>> - memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
>>> + memcpy((void *)&aHdr[0], (const void *)&pWal->hdr, sizeof(WalIndexHdr));
>> If the compiler complained about that, the compiler is broken.
>
> The change was rather collateral (read cosmetical) to the real warning
> which remains unfixed.
>
> The compiler warning is this:
> ...
> ===> lib/libsqlite3 (obj,depend,all,install)
> cc1: warnings being treated as errors
> /scratch/tmp/pfg/head/lib/libsqlite3/../../contrib/sqlite3/sqlite3.c: In function 'walIndexWriteHdr':
> /scratch/tmp/pfg/head/lib/libsqlite3/../../contrib/sqlite3/sqlite3.c:49490: warning: passing argument 1 of 'memcpy' discards qualifiers from pointer target type
> /scratch/tmp/pfg/head/lib/libsqlite3/../../contrib/sqlite3/sqlite3.c:49492: warning: passing argument 1 of 'memcpy' discards qualifiers from pointer target type
> --- sqlite3.So ---
> *** [sqlite3.So] Error code 1
> ...
>
> make[6]: stopped in /scratch/tmp/pfg/head/lib/libsqlite3
>
> It only happens when using the experimental FORTIFY_SOURCE support [1],
> and it only happens with gcc (the base one is the only tested).
>
> Yes, I am suspecting a compiler bug but gcc has been really useful to find
> bugs in fortify_source.
Actually, it is right to warn about this, as the casts drop a volatile
specifier:
49482 static void walIndexWriteHdr(Wal *pWal){
49483 volatile WalIndexHdr *aHdr = walIndexHdr(pWal);
...
49490 memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
49491 walShmBarrier(pWal);
49492 memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
If you compile this with clang, and a high enough WARNS level, it tells
you where the problem is:
contrib/sqlite3/sqlite3.c:49490:18: error: cast from 'volatile struct WalIndexHdr *' to 'void *' drops volatile qualifier [-Werror,-Wcast-qual]
memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
^
contrib/sqlite3/sqlite3.c:49492:18: error: cast from 'volatile struct WalIndexHdr *' to 'void *' drops volatile qualifier [-Werror,-Wcast-qual]
memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
^
Similar with newer versions of gcc:
contrib/sqlite3/sqlite3.c:49490:10: error: cast discards 'volatile' qualifier from pointer target type [-Werror=cast-qual]
memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
^
contrib/sqlite3/sqlite3.c:49492:10: error: cast discards 'volatile' qualifier from pointer target type [-Werror=cast-qual]
memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
^
Removing all the casts does not help, with base gcc it still gives:
contrib/sqlite3/sqlite3.c:49490: warning: passing argument 1 of 'memcpy' discards qualifiers from pointer target type
contrib/sqlite3/sqlite3.c:49492: warning: passing argument 1 of 'memcpy' discards qualifiers from pointer target type
and with clang:
contrib/sqlite3/sqlite3.c:49490:10: error: passing 'volatile WalIndexHdr *' (aka 'volatile struct WalIndexHdr *') to parameter of type 'void *' discards qualifiers
[-Werror,-Wincompatible-pointer-types-discards-qualifiers]
memcpy(&aHdr[1], &pWal->hdr, sizeof(WalIndexHdr));
^~~~~~~~
/usr/include/string.h:62:31: note: passing argument to parameter here
void *memcpy(void * __restrict, const void * __restrict, size_t);
^
contrib/sqlite3/sqlite3.c:49492:10: error: passing 'volatile WalIndexHdr *' (aka 'volatile struct WalIndexHdr *') to parameter of type 'void *' discards qualifiers
[-Werror,-Wincompatible-pointer-types-discards-qualifiers]
memcpy(&aHdr[0], &pWal->hdr, sizeof(WalIndexHdr));
^~~~~~~~
/usr/include/string.h:62:31: note: passing argument to parameter here
void *memcpy(void * __restrict, const void * __restrict, size_t);
^
>> 'const'
>> is a promise to the caller that the given parameter will not be modified
>> by the callee. There's no requirement that the passed argument be const.
>> As bde commented, the casts are all spurious.
>
> And since this is contrib'ed code I am not going through the
> code churn but upstream has been notified.
I don't think it is likely that upstream will go through the trouble of
removing -Wcast-qual warnings. There are 152 of them in sqlite3.c. :-)
-Dimitry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freebsd.org/pipermail/svn-src-all/attachments/20150719/54398d70/attachment.bin>
More information about the svn-src-all
mailing list