clang-11.0.0编译错误的SQLite

2020-06-04 13:18:49

看起来clang-11.0.0编译器错误编译了sqlite3.c版本3.32.1。我已经签入了对SQLite的更改,似乎可以解决这个问题。但可能还有其他虫子。因此,请谨慎使用clang-11.0.0并仔细测试您的应用程序!

OSSFuzz在SQLite上报告了错误23003。我无法在我的桌面(带有GCC-5.4.0的Ubuntu)上重现这个问题,所以我按照OSSFuzz错误复制过程发现了OSSFuzz当前使用的clang-11.0.0似乎有问题。

错误编译的代码是src/utf.c源文件的第345-347行,如下所示:

从-S输出中可以看出,Clang-11.0.0正在编译这三行代码,就好像有这样的代码:

换句话说,Clang似乎假定sqlite3VdbeMemRelease()函数不会更改PMEM->;标志的值。但它确实存在。我的解决办法是在函数调用之前而不是之后对PMEM->;标志进行位调整:

CLANG-O1-FNO-OMIT-FRAME-POINTER-GLINE-TABLES-ONLY-DFUZZING_BUILD_MODE_UNSAFE_FOR_PROGATION-FSANITIZE=ADDRESS-FSANITIZE-ADDRESS-USE-SCOPE-FSANITZE=FUZZER-NO-LINK-DSQLITE_MAX_LENGTH=128000000-DSQLITE_MAX_SQL_LENGTH=128000000-DSQLITE_MAX_MEMORY=25000000-DSQLITE_PRE。-c-o1-g./sqlite3.c-o sqlite3.o