自定义Sqlite函数在32位和64位系统上的行为不同

时间:2014-02-27 11:52:42

标签: c sqlite 32bit-64bit

我在项目中使用自定义Metaphone Sqlite函数。这是函数的链接:

https://github.com/geocommons/geocoder/blob/master/src/libsqlite3_geocoder/metaphon.c

当我在32位Ubuntu上运行该函数时,执行类似:

的操作
$ sqlite3
SQLite version 3.7.17 2013-05-20 00:56:22
sqlite> .load ./libsqlite3_geocoder.so 
sqlite> select metaphone('hitchcock');
XKK

如您所见,该函数返回了无效结果(正确结果为HXKK)。在64位Ubuntu上,不会发生此错误。

奇怪的是,如果我将此函数编译为独立的C程序(删除所有Sqlite的东西),它在32位操作系统上也能正常工作。

任何想法可能是什么原因以及如何解决它?

注意:如果您想自己尝试,只需从Github获取code,在make目录中运行src/libsqlite3_geocoder并构建.so。你需要sqlite3开发库来编译它。

1 个答案:

答案 0 :(得分:0)

找到它。 metaphone()函数中存在一个错误,在某一点上它会检查给定字符串边界之外的字符,这显然会在不同情况下返回不同的值(不确定这是否与OS是32位还是64位有关)位):

case 'H':
    if (!varson(*(n - 1)) && (!vowel(*(n - 1)) || // see that "n - 1" here!
                               vowel(*(n + 1))))
    {
        *Metaph++ = 'H';
    }
    break;