健康代码

此文档已移动!

下一版本发布后,将删除下面的文本。

检查新类层次结构中的ClassID

检查新类层次结构中是否没有“穷人的RTTI”方法。

在ICU 50之后:新的类层次结构根本不应该声明getDynamicClassID()。UObject有一个虚拟实现。

ICU 4.6.50:新的类层次结构使用了UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION。请参阅Normalizer2,以获取满足虚函数覆盖而不添加新ClassID支持的示例声明和实现。

我们确实需要在旧类和扩展现有类层次结构的新类中保留并添加“穷人的RTTI”(父类具有@stable RTTI函数)。(例如,一个新的Format子类。)

检查这一点的一个简单方法是搜索API更改报告并查找“UClassID”或类似内容。

    • 旧:是http://bugs.icu-project.org/trac/build/icu4cdocs

      • 进入最新的成功构建,报告是那里的附件。

      • 下载旁边的样式表:https://github.com/unicode-org/icu/blob/master/icu4c/icu4c.css

检查ICU4C源文件中的非ascii字符[已过时]

注:ICU4C和ICU4J源文件为UTF-8。ASCII检查不再适用于他们。

cd icu4c/源

找到\(-name“*.[ch]”-或-name“*.cpp”\)-exec grep-PHn[^[:ascii:]]{}\;

检查源文件的有效UTF-8和正确的文本文件行结尾

验证存储库中的所有源文件和文本文件都具有纯LF行尾。

要在Linux上执行此操作,请在最新的git工作区中,

cd icu/icu4c/来源

tools/icu-file-utf8-check.py#报告问题

来自icu4c工具的相同python脚本也将检查icu4j

cd icu/icu4j

../icu4c/source/tools/icu-file-utf8-check.py

要仔细检查行尾,以下grep将查找包含\r字符的所有文本文件。不要从需要行尾的Windows运行。

cd icu

grep-rPIl“\r”*

即使在Mac或Linux上运行,也会通过此检查找到一些特定于WIndows的文件(.bat等)。这没关系。

检查UTF-8文件属性[过时]

注:截至ICU 63,项目从svn转移到GitHub。SVN文件属性不再相关。

注意:从ICU 59开始,ICU4C源文件是UTF-8编码的,并且具有svn mime-type属性“text/plain;charset=UTF-8”。它们不能有BOM。

这由上述任务检查,检查svn属性、有效的UTF-8和文本文件行结尾。

以前用于此任务的bomfix.py脚本必须在ICU4C源上运行

注:本任务仅适用于ICU4C。java源文件使用UTF-8编码,但必须没有UTF-8 BOM。

检查以下匹配项:标记为UTF-8的文件与以UTF-8签名字节序列(“BOM”)开头的文件。

运行时间:

cd{icu}/icu4c

蟒蛇/工具/版本/c/bomfix.py

清理导入语句

Eclipse IDE提供了一个功能,允许您组织多个文件的导入语句。右键单击项目/源文件夹/文件,您可以选择[source]-[Organize Imports]来解析所有通配符导入,并按一致的顺序对导入语句进行排序。(注意:当您对包含许多文件的项目/文件夹运行此命令时,可能会遇到OOM问题。在这种情况下,您可能需要缩小每次迭代的选择范围。)

检查库依赖项

ICU 64+(2019+):由构建机器人自动完成,至少在两种模式(调试/发布)中的一种模式下完成,可以作为BRS任务跳过。

我们希望使.c/.cpp/.o文件之间的依赖关系保持合理,包括ICU库之间和内部的依赖关系。

在Linux上,运行 源/测试/depstest/depstest.py,例如:

~/icu/mine/src/icu4c/source/test/depstest$/depstest.py~/icu/mine/dbg/icu4c

这样做两次:一次用于发布版本(优化),一次用于调试版本(未优化)。它们引入了稍微不同的标准库符号集(参见dependencies.txt中的注释)。

如果一切正常,测试将打印“确定:指定的依赖项和实际的依赖项匹配。”如果不匹配。。。

让其他人审查变更,包括Markus;包括dependencies.txt、.py脚本或ICU4C代码中的更改。

起初,测试可能会抱怨dependencies.txt中没有列出.o文件,或者,如果文件被删除,则会反过来抱怨。尝试将其添加到组中,或根据需要创建新组。

通常,具有较少依赖性的较小组更可取。如果ICU内部不需要公共API(例如,通过转换构建UnicodeString)(例如,unistr_cnv),则使其库依赖于其新组。

如果测试打印“Info:group icuplug does not need to depending on platform”,那么插件代码将被禁用,这是ICU 56以来的默认代码。考虑启用它进行依赖项检查,但请确保在提交更改之前还原它!

通常还有其他“信息”消息,工具认为不需要依赖于系统符号。它们是无害的,也就是说,不要试图删除它们:根据使用的编译器标志,它们是需要的还是不需要的。如果删除它们,则可能会导致具有不同标志的用户出错。此外,在未优化的构建中,您只能获得一半的信息消息。您可以在优化的构建中获得更多,因为会有更多的系统内容被内联。

测试可能会抱怨“这是一个新的系统符号吗?”我们应该小心添加这些符号。例如,我们不能从库代码调用printf(),也不能调用全局运算符new。

测试可能会抱怨某些.o文件“导入icu_48::UnicodeString::Unicode字符串(const char*),但不依赖于unistr_cnv.o”。这可能意味着有人将简单的“string literal”或char*传递到接受UnicodeString的函数中,该函数调用默认转换构造函数。我们不希望那样!在大多数情况下,应修复此类代码,如 变更集30186。只有需要转换的API实现才能依赖于它;例如,group formattable_cnv依赖于group unistr_cnv,但ICU内部没有任何依赖性。

验证正确的内存分配功能

验证以下库代码(common、i18n、layout、ustdio)。要求通过更改cmemory.h和公共基类来定制ICU的内存管理。

注:这一要求仍然存在。解决问题的技术是有效的。用于测试,请参阅上面的“检查库依赖项”一节。

    • 没有原始的malloc/free/realloc,只有它们的uprv_版本。

    • 所有C++类都必须继承公共基类UObject或UMemory

      • 但不适用于mixin/interface类(纯虚拟、无数据成员、无构造函数),因为这会破坏单继承模型。

      • 也不适用于纯静态类(用于名称范围)声明,但不实现私有默认构造函数以防止实例化。

      • 没有构造函数、析构函数和虚方法的简单类结构C++类(和结构)不需要继承基类,但必须使用uprv_malloc进行分配。

    • 所有简单类型(UChar、int32_t、指针(!)、…)必须使用uprv_malloc进行分配,并使用uprv_free进行释放。

    • 对于在Linux上测试这种情况

      • 运行Perl脚本ICUMemCheck.pl。按照脚本中的说明进行操作。该脚本位于ICU4C源代码的source/tools/memcheck/ICUMemCheck.pl中。

      • 此外,如果使用全局运算符new,depstest.py将显示错误消息(请参阅有关检查依赖项的部分)

    • 要测试这种情况,请在Windows上执行以下操作:

      • 从2004年11月开始,不用麻烦了。失败出现在mixin类析构函数的许多文件中。在Linux上进行检查。但是,作为参考,这里是旧的说明。

        • 确保在u对象。小时 U对象::新建删除默认情况下定义。目前,这意味着要让grep看到U_OVERRIDE_CXX_分配定义为1(in密码32.h适用于Windows)。

        • 检查*.obj是否链接到全局(非UObject::)运算符new/delete;有关详细信息,请参见uobject.cpp。

        • 全球的新的绝不能导入。全球的删除将被导入并由interface/mixin类中的empty-virtual析构函数使用。然而,它们没有被调用,因为实现类总是从UMemory派生的。其他函数都不能使用全局删除。

        • 现在(2002年12月17日)在丁基橡胶。小时对于全局new/delete,内联实现总是会崩溃。这些全局new/delete操作符仅针对ICU4C库中的代码定义(但必须针对所有这些)。见2581号票据。

        • 如果在某处使用了全局new/delete,则更改类继承和/或使用uprv_malloc/free,直到库中没有使用全局new/dete(并且测试仍然通过…)。有关详细信息,请参阅《用户指南编码指南》。

运行静态代码分析工具

(净化、边界检查器、valgrind…)

确保我们修复了运行这些工具时发现的所有内存泄漏问题。

使用调试信息构建ICU。在Linux上,

runConfigureICU--启用调试--禁用释放Linux

在valgrind下运行所有标准测试,

cd<where ever>/source/test/intltest

LD_LIBRARY_PATH=..//库:..//存根数据:..//tools/ctestfw:$LD_LIBRARY_PATH valgrind/最内部的

您可以从“makecheck”的输出中获取用于运行测试的命令行,然后在可执行文件之前插入“valgrind”。

检查代码覆盖率

我们的目标是,所有发行版都要向公众发布100%的API测试和至少85%的代码覆盖率。

测试ICU4C集管

测试ICU4C公共标头

测试头文件中的外部依赖项:

(在Unix上)前提条件:使用--prefix(../icu4c/source/runConfigureICU Linux--prefix=/some/temp/folder)进行配置,并执行“make install”。然后设置PATH,以便可以找到安装的icu-config脚本。(导出路径=/some/temp/文件夹/箱子:$PATH)

然后转到“icu4c/test/hdrtst”目录(注意:不是“source/test/hdrtst”)并进行“make check”。这将尝试分别对每个头文件进行编译,以确保没有任何问题。输出如下所示,如果没有出现错误,则一切正常。

如果C++文件无法编译为C文件,请将其添加到hdrtst目录中的“cxxfiles.txt”中。

从ICU 65开始,hdrtst现在作为常规CI构建的一部分运行,C++标头现在由宏“U_SHOW_CPLUSPLUS_API”保护。

不再有任何“cxxfiles.txt”文件。相反,公共C++标头都由宏“U_SHOW_CPLUSPLUS_API”保护,如果定义了__CPLUSPLUS,该宏默认设置为1。如果ICU用户希望只使用C API,则可以在包含任何ICU头之前显式设置宏。任何新的公共C++标头都需要用宏进行类似的保护,尽管在合并之前,应该在CI构建中为拉请求捕获这一点。

使用所有uconfig.h变体运行此测试(见下文)。

ctest unicode/docmain。小时

ctest unicode/icudataver。小时

ctest unicode/icuplug。小时

测试ICU4C内部集管

直接从源代码树运行以下脚本(从“source”文件夹内部,而不是顶层),无需构建或安装。

对于新版本,还要查找新的工具和测试,并将其文件夹添加到脚本中。您可以忽略在特定目录中未找到“*.h”文件的消息。

命令行很简单

~/git.icu/icu4c/source$test/hdrtst/testinternalheaders.sh

请参见http://bugs.icu-project.org/trac/tickt/12141“如果每个头文件依赖于它们的定义,那么它应该包含所有其他头文件”

截至ICU 68,内部头部测试现已作为Travis CI的一部分实现自动化。

测试uconfig.h变化

完全测试ICU,并使用以下命令运行标题测试(如上):

    1. 没有人打开的“UCONFIG_NO_XXX”开关的数量(即正常情况)

    2. 全部的打开的“UCONFIG_NO_XXX”开关(设置为1)

    3. 对于每个开关,用只是那一个开关打开了。但请注意关于 UCONFIG_NO_CONVERSION测试下面。

(请参见 通用/unicode/uconfig。小时有关更多文档。)

有一个脚本可用于在UNIXe上以这种方式自动测试ICU,它位于: 工具/版本/c/uconfigtest.sh。有关信息,请参阅脚本顶部的文档。

当保护条件(例如#ifndef U_HIDE_INTERNAL_API)因导致标头测试失败而被删除时,请在标头文件中注意保护条件不能在该位置使用的原因,否则它们很可能会在将来被重新添加。

测试C++命名空间的使用

验证是否在不启用默认使用ICU命名空间的情况下生成ICU。要在Linux上测试,

./runConfigureICU Linux CXXFLAGS=“-DU_USING_ICU_NAMESPACE=0”

进行检查

任何问题都会显示为编译错误。

当ICU C++命名空间之外的定义引用ICU C++类时,需要使用“icu::“,如”icu::Unicode字符串“。在极少数情况下,C++类型在C代码中也是可见的(例如,ucol_imp.h具有cintltst可见的定义),然后我们使用U_NAMESPACE_限定符为C编译时定义为空。

自动构建系统应该有一台同时设置-DU_USING_ICU_NAMESPACE=0-DU_CHARSET_IS_UTF8=1.

测试UCONFIG_NO_CONVERSION

确保构建ICU4C公共和i18n库时UCONFIG_NO_CONVERSION设置为1。我们不能将此作为“Test-uconfig.h变体”的一部分,因为测试套件不能这样构建,但库代码必须支持它。

最简单的方法是使用ICU4C工作区,修改uconfig。小时暂时通过将UCONFIG_NO_CONVERSION的值更改为1,并执行“make-j 6”(而不是“make check”或“make tests”)。验证stubdata、common&i18n库构建良好;布局也应该构建,但toolutil将失败,这是意料之中的。

修复所有stubdata/common/i18n问题,恢复UCONFIG_NO_CONVERSION值,并验证它是否仍能正常工作。

如果出现这种情况,可能有人无意中使用了UnicodeString(constchar*)构造函数。请参阅中的“检查库依赖项”部分和修复示例变更集30186.

测试U_CHARSET_IS_UTF8

验证ICU构建时默认字符集硬编码为UTF-8。要在Linux上测试,

./runConfigureICU Linux CPPFLAGS=“-DU_CHARSET_IS_UTF8=1”

make-j6检查

任何问题都会显示为编译或测试错误。

除了设置CPPFLAGS,您还可以临时添加#定义U_CHARSET_IS_UTF8 1在unicode/platform.h中获取默认定义之前,或在那里修改默认定义。(在ICU 4.8及更早版本中,此标志为unicode/utypes.h。)

这在设置为使用UTF-8作为系统字符集的机器上效果最好,这在Windows上是不可能的。

自动构建系统应该有一台同时设置-DU_USING_ICU_NAMESPACE=0-DU_CHARSET_IS_UTF8=1.

测试U_OVERRIDE_CXX_ALLOCATION=0

在Linux上验证ICU构建时U_OVERRIDE_CXX_ALLOCATION=0。问题将显示为构建失败。

CPPFLAGS=“-DU_OVERRIDE_CXX_ALLOCATION=0”/运行配置ICU Linux

使干净

make-j12检查

测试ICU_USE_THREADS=0[过时]

仅需要达到ICU4C 49。

    • ICU 50m1从运行时代码(票证)中删除ICU_USE_THREADS #9010).

    • 在ICU_USE_THREADS=0的情况下,仍然可以构建和测试intltest,但这几乎没有那么重要。

    • 在50m1重症监护室--禁用线程configure选项不存在。如果要使用ICU_USE_THREADS=0进行测试,请在intltest.h或intltest-Makefile中临时更改此标志。

验证ICU在禁用线程的情况下进行构建和测试。要在Linux上测试,

./runConfigureICU Linux--禁用线程

进行检查

测试ICU4C样本和演示

要使用Visual Studio在Windows上构建ICU4C示例,请使用以下步骤:

    • 打开位于“source\allione\allione.sln”下的“allione”解决方案文件。

    • 构建调试/发布+x86/x64配置(全部4种配置)。

      • 确保生成的数据文件(例如:“icu4c\bin\icudt64.dll”)不是存根数据,应该是~26MB。

    • 打开位于“source\samples\all\all.sln”下的“all”解决方案文件。

    • 使用“批量构建”选项构建x86和x64。它位于菜单“Build”>“Batch Build”下。

      • 单击“全选”按钮。

      • 单击“构建”按钮。

      • 如果Visual Studio使用“批生成”选项返回错误,请分别生成每个配置。

    • 所有样本都应该干净地构建,没有错误。

要测试示例程序,请为每个配置运行“source\samples\all\samplecheck.bat”脚本,并确保它们成功。

通过Docker测试ICU4C演示

请参见https://github.com/unicode-org/icu-demos/blob/master/icu-kube/README.md

通过Docker测试ICU4J Web演示

请参见:https://github.com/unicode-org/icu-demos/blob/master/icu4jweb/README.md

测试ICU4J演示

这些是演示小程序,请参阅上面的icu4jweb演示。

要测试ICU4J演示应用程序,请cd到ICU4J目录并构建和运行演示。

$cd icu4j

$ant jarDemos

$java-jar icu4jdemos.jar

上述命令调用GUI演示应用程序。因此,它必须连接到X-Server。最简单的方法是在执行远程桌面的机器上运行,而不是在ssh shell中运行。

演示包括日历、字符集检测、假日、RBNF和音译。检查每个应用程序是否工作正常。

要检查ICU4J示例,请打开Eclipse工作区并从目录<ICU4J_root>/samples导入ICU4J示例项目。确保这些示例代码没有生成问题。还可以使用main运行示例代码,并查看每个示例代码是否运行。

测试,详尽模式,C&J

对于ICU4J,

$ant exhaustive检查

对于ICU4C,使用优化构建进行测试将有助于减少测试完成所需的时间。

$make-j6检查彻底

使用螺纹消毒剂测试ICU4C

构建机器人在最有趣的多线程测试上运行线程消毒剂。这些说明在整个测试套件上运行消毒剂。需要clang编译器。

$CPPFLAGS=-fsanitize=thread LDFLAGS=-fsonitize=线程/runConfigureICU--enable-debug--disable-release Linux--disable-renaming

$清理

$make-j6支票