【问题标题】:A custom Sqlite function behaves differently on 32-bit and 64-bit systems自定义 Sqlite 函数在 32 位和 64 位系统上的行为不同
【发布时间】:2014-03-30 20:03:00
【问题描述】:

我在一个项目中使用了一个自定义的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,在src/libsqlite3_geocoder 目录中运行make,并构建.so。你需要 sqlite3 开发库来编译它。

【问题讨论】:

    标签: c sqlite 32bit-64bit


    【解决方案1】:

    找到了。 metaphone() 函数中有一个错误,它在某一时刻检查给定字符串范围之外的字符,这显然在不同情况下返回不同的值(不确定这是否与操作系统是 32 位还是 64 位有关):

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

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2011-06-30
      • 2012-07-26
      • 2011-11-11
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多