2012-08-15 62 views
1

我一直有与ICU的基于规则的Transliterator问题,这竟然是一个缺少-O2标志的调试版本使用G ++ 4.7.1引起工作。这是工作正常,当我做了一个发布版本(其中有-O2),但是当我建立我的项目没有这种标志调试,Transliterator对象永远不会被正确创建。ICU Transliterator不无-02标志使用g ++

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

没有优化,t被分配一个空指针和status设置为32767,在通过ICU的u_errorName()运行翻译为BOGUS UErrorCode

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

测试表明-O1,-O2-O3都按预期工作,只有-O0导致发生此情况。

有人可以解释为什么这应该是这样吗?

+1

它看起来像*使用调试器的*完美局面。 – 2012-08-15 18:11:51

+0

@ n.m。那么,我想我可以用调试符号重建ICU ... – SigueSigueBen 2012-08-15 18:57:19

+0

@ n.m。通常这是另一种方式 - 调试模式'解决'它! – 2012-08-15 20:09:40

回答

2

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

+0

我已更新该问题。我也会提交一份错误报告。 – SigueSigueBen 2012-08-15 20:28:36

+0

@SigueSigueBen它发生在所有规则或只有一组? – 2012-08-15 20:47:05

+0

@StevenRLoomis我只用一个规则集来测试它。但是,我已经检查了UnicodeString,以确保在函数调用之前其内容是正确的。我应该补充说,'parseError'的行和列号设置为我的规则集超出范围,但都是非负的。 – SigueSigueBen 2012-08-15 20:53:38