On Fri, Sep 29, 2017 at 1:07 AM, Denis V. Razumovsky <t...@denis.im> wrote:
> Please remove multiple warnings from compiler about optimisation, > variable conversion, signed overflow and many more potential errors. > > 1. Optimisation solutions from GCC: > If you would like to add extra warning attributes to compile SQLite with > gcc (and many others modern compilers) you will see the warnings about > pure, const and other optimisation suggestion. All those optimizations > can add more performance to final product due to various assembly > optimisations. > > Static build of the last SQLite amalgamation version 3.20.0 with gcc -03 > optimisation which uses the following parameters: > -Wsuggest-attribute=const -Wsuggest-attribute=pure > -Wsuggest-attribute=noreturn -Wsuggest-attribute=format > -Wmissing-format-attribute > > has 87 recommendations as for “pure” functions. > https://stackoverflow.com/questions/11153796/benefits-of-pure-function Interesting. > > 2. Error warnings: > > With -Wall -Wextra -Wpedantic -Wshadow options we can see extra warnings > about potential errors as follows: > > 217 warnings “is not defined” like: > > SQLite3.c:74:5: warning: "SQLITE_4_BYTE_ALIGNED_MALLOC" is not defined > [-Wundef] > #if SQLITE_4_BYTE_ALIGNED_MALLOC > ^ > that's known to evaluate as 0. It's part of c standard. it's just silly to make a warning about it. > > 20 warnings “cast discards __attribute__((noreturn))” like: > > SQLite3.c:55734:10: warning: cast discards ‘__attribute__((noreturn))’ > qualifier from pointer target type [-Wcast-qual] > memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); > > 768 warnings “may change the sign of the result” like: > > SQLite3.c:19330:11: warning: conversion to ‘unsigned int’ from ‘int’ may > change the sign of the result [-Wsign-conversion] > > 75 warnings “signed overflow” like: > SQLite3.c:61116:3: warning: assuming signed overflow does not occur when > reducing constant in comparison [-Wstrict-overflow] > > As a result I would like to recommend to build SQLite with all extra > warning options. In total, I have counted unbelievable 2628 warnings of > potential errors without any efforts from my side. > > As for the above... those can be catastrophic; and I'm surprised there are so many sign conversion warnings generated... > 3. How to reproduce: > > a) amalgamation SQLite version 3.20.0 > > b) gcc version: > $ gcc -v > Using built-in specs. > COLLECT_GCC=gcc > COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper > Target: x86_64-linux-gnu > Configured with: ../src/configure -v --with-pkgversion='Ubuntu > 5.4.0-6ubuntu1~16.04.4' > --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs > --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ > --prefix=/usr --program-suffix=-5 --enable-shared > --enable-linker-build-id --libexecdir=/usr/lib > --without-included-gettext --enable-threads=posix --libdir=/usr/lib > --enable-nls --with-sysroot=/ --enable-clocale=gnu > --enable-libstdcxx-debug --enable-libstdcxx-time=yes > --with-default-libstdcxx-abi=new --enable-gnu-unique-object > --disable-vtable-verify --enable-libmpx --enable-plugin > --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk > --enable-gtk-cairo > --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre > --enable-java-home > --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 > --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 > --with-arch-directory=amd64 > --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc > --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 > --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic > --enable-checking=release --build=x86_64-linux-gnu > --host=x86_64-linux-gnu --target=x86_64-linux-gnu > Thread model: posix > gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) > > с) Lubuntu 16.04 > > d) Files: > $ ls > main.c Makefile sqlite3.c sqlite3.h > > $ cat Makefile > # Compiler flags > # > CC ?= cc > > CFLAGS += -pipe -std=c11 > CFLAGS += -fbuiltin > SQLITEFLAGS += -DSQLITE_THREADSAFE=0 > SQLITEFLAGS += -DSQLITE_OMIT_LOAD_EXTENSION > CFLAGS += $(SQLITEFLAGS) > EXE = sqlite_test > STATIC = -static > STRIP = -s > > WFLAGS += -Wall -Wextra -Wpedantic -Wshadow > WFLAGS += -Wconversion -Wsign-conversion -Winit-self -Wunreachable-code > -Wformat-y2k > WFLAGS += -Wformat-nonliteral -Wformat-security -Wmissing-include-dirs > WFLAGS += -Wswitch-default -Wtrigraphs -Wstrict-overflow=5 > WFLAGS += -Wfloat-equal -Wundef -Wshadow > WFLAGS += -Wbad-function-cast -Wcast-qual -Wcast-align > WFLAGS += -Wwrite-strings > WFLAGS += -Winline > > ifneq ($(CC), clang) > WFLAGS += -Wlogical-op > CFLAGS += -finline-functions > CFLAGS += -flto > # Perform a number of minor optimizations that are relatively expensive. > CFLAGS += -fexpensive-optimizations > # Attempt to remove redundant extension instructions. This is especially > helpful for the x86-64 architecture, which implicitly zero-extends in > 64-bit registers after writing to their lower 32-bit half. > CFLAGS += -free > endif > > # > # Project files > # > SRCS = $(wildcard *.c) > HDRS = $(wildcard *.h) > # Exclude a file > OBJS = $(SRCS:.c=.o) > > # > # Release build settings > # > RELDIR = release > RELEXE = $(RELDIR)/$(EXE) > RELOBJS = $(addprefix $(RELDIR)/, $(OBJS)) > RELCFLAGS = -O3 -funroll-loops -DNDEBUG > RELCFLAGS += -march=native > # GCC only options > ifneq ($(CC), clang) > RELWFLAGS += -Wsuggest-attribute=const -Wsuggest-attribute=pure > -Wsuggest-attribute=noreturn -Wsuggest-attribute=format > -Wmissing-format-attribute > endif > > .PHONY: all clean release > > # Default build > all: release > > # > # Release rules > # > release: $(RELEXE) > > $(RELEXE): $(RELOBJS) > $(CC) $(CFLAGS) $(WFLAGS) $(RELWFLAGS) $(RELCFLAGS) $(STATIC) > $(STRIP) -o $(RELEXE) $^ $(LDFLAGS) $(RELLDFLAGS) $(TCMALLOC) > echo "$(RELEXE) linked." > > $(RELDIR)/%.o: %.c $(HDRS) > mkdir -p $(RELDIR) > $(CC) -c $(CFLAGS) $(WFLAGS) $(RELWFLAGS) $(RELCFLAGS) -o $@ $< > echo $<" compiled." > > > clean: > rm -rf $(RELEXE) $(RELOBJS) > test -d $(RELDIR) && rm -d $(RELDIR) || true > > > $ cat ./main.c > #include "sqlite3.h" > #include <stdio.h> > > int main(void){ > > printf("SQLite version: %s\n",sqlite3_libversion()); > > return 0; > > } > > e) Run: > $ ./release/sqlite_test > SQLite version: 3.21.0 > > > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users