On 18 Jul 2015, at 00:53, Pedro Giffuni <p...@freebsd.org> wrote: > > On 07/17/15 17:26, Peter Jeremy wrote: >> On 2015-Jul-16 22:07:14 +0000, "Pedro F. Giffuni" <p...@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
signature.asc
Description: Message signed with OpenPGP using GPGMail