1

我一直在使用 ICU 的基于规则的 Transliterator 遇到问题,结果证明这是由-O2使用 g++ 4.7.1 的调试版本中缺少标志引起的。当我进行发布构建(具有-O2)时它工作正常,但是当我构建我的项目时没有该标志进行调试时,该Transliterator对象将永远无法正确创建。

Transliterator* t = Transliterator::createFromRules(id, rules, UTRANS_FORWARD, parseError, status);

未经优化,t分配一个空指针并status设置为 32767,BOGUS UErrorCode当通过 ICU 运行时转换为u_errorName().

我尝试的第一件事是-g从我的构建中删除调试标志,但这对createFromRules()返回的内容没有影响。只有当我添加-O2时它才创建Transliterator对象。

测试表明-O1,-O2并且-O3所有工作都按预期工作,并且只会-O0导致这种情况发生。

有人可以解释为什么会这样吗?

4

1 回答 1

2

无论有/没有调试,您都不应该有不同的结果。你能创建一个包含规则的小测试用例,给出 ICU 版本和操作系统/平台,并提交工单吗?4.7.1 于 2 个月前发布。可能是编译器错误(ICU 有很的发现这些错误的历史!!)或潜在错误。您可以将错误链接到此问题,反之亦然。

于 2012-08-15T20:12:05.997 回答