编译reMail项目后没有错误,其中一个警告是:
remail-iphone / sqlite3 / sqlite3.c:18703:15:签名移位结果 (0x1F0000000)需要34位来表示,但'int'只有32位 位
即。以下代码中的(0x1f<<28)
:
if (!(a&0x80))
{
a &= (0x1f<<28)|(0x7f<<14)|(0x7f);
b &= (0x7f<<14)|(0x7f);
b = b<<7;
a |= b;
s = s>>11;
*v = ((u64)s)<<32 | a;
return 7;
}
为iOS(32位)终止此警告的正确方法是什么?
答案 0 :(得分:1)
针对iPhone的reMail似乎使用旧版本的SQLite(3.6.15)。如果我没有弄错,以下提交应该可以解决这个问题:http://www.sqlite.org/src/info/587109c81a9cf479?sbs=0
if (!(a&0x80))
{
/* assert( ((0xFF<<28)|(0x7f<<14)|(0x7f))==0xf01fc07f ); */
a &= 0xf01fc07f;
b &= (0x7f<<14)|(0x7f);
b = b<<7;
a |= b;
s = s>>11;
*v = ((u64)s)<<32 | a;
return 7;
}
但是,可能会出现此问题的其他代码部分。上面提到的链接显示了util.c中的两个实例,但由于sqlite.c是“SQLite中许多单独的C源文件的合并”,因此您可能会发现其他事件。 也许reMail也适用于SQLite的最新版本......