1 2 3# OpenTrustee CA/TA开发指南 4 5## CA/TA访问机制 6 7OpenTrustee应用分为CA(客户端应用)和TA(可信应用)。OpenTrustee支持CA访问TA,也支持TA访问TA。TA采用命令响应机制,交互流程如下: 8 9 10 11 121. CA调用TEEC_InitializeContext初始化客户端上下文,这个过程并不会访问TA。 132. CA调用TEEC_OpenSession建立与TA的会话。OpenTrustee系统会把TA加载运行,创建TA实例并调用TA的TA_CreateEntryPoint。然后再创建TA会话并调用TA的TA_OpenSessionEntryPoint接口。客户端可以跟TA建立多个会话,每个会话发起时OpenTrustee都会调用TA_OpenSessionEntryPoint接口。 143. CA调用TEEC_InvokeCommand向TA发送命令,OpenTrustee系统会调用TA的TA_InvokeCommandEntryPoint接口处理该命令并返回结果。 154. CA调用TEEC_CloseSession关闭与TA的会话。OpenTrustee系统会调用TA的TA_CloseSessionEntryPoint接口清理资源。在TA最后一个会话被关闭时,OpenTrustee系统会调用TA的TA_DestroyEntryPoint接口清理全局资源。 165. CA调用TEEC_FinalizeContext,清理上下文。 17 18OpenTrustee的实现遵循GP TEE标准的规定,上述流程可参考GP TEE标准。 19 20## CA开发指导 21 22CA即OpenHarmony系统侧应用,比如native程序、SA服务、或HAP应用。 23 24### CA接口库 25 26对于用户态CA,OpenTrustee TEE client模块为CA提供了访问TEE的接口库和API。 27 28对于system/bin侧的CA,引用TEE头文件和接口库的方式为,在CA的BUILD.gn文件中增加如下引用: 29 30``` 31include_dirs = [ 32 "//base/tee/tee_client/interfaces/libteec" 33] 34deps = [ 35 "//base/tee/tee_client/frameworks/build/standard:libteec" 36] 37``` 38 39对于vendor/bin侧的CA,引用TEE头文件和接口库的方式为,在CA的BUILD.gn文件中增加如下引用: 40 41``` 42include_dirs = [ 43 "//base/tee/tee_client/interfaces/libteec" 44] 45deps = [ 46 "//base/tee/tee_client/frameworks/build/standard:libteec_vendor" 47] 48``` 49 50### CA API 51 52OpenTrustee提供的CA API基本是符合GP TEE标准规定的,可参考《[TEE Client API Specification v1.0 (GPD_SPE_007)](https://globalplatform.org/specs-library/?filter-committee=tee)》。少量实现与GP TEE规范有差异,差异点如下: 53 541. TEEC_OpenSession接口的TEEC_Context结构体成员 ta_path支持指定TA的加载路径(限制在/data目录) 55 56 举例如下: 57 58 ``` 59 TEEC_Context context; 60 context.ta_path = (uint8_t *)"/data/58dbb3b9-4a0c-42d2-a84d-7c7ab17539fc.sec" 61 ``` 62 632. TEEC_OpenSession接口入参connectionMethod只支持TEEC_LOGIN_IDENTIFY 64 65 对于TEEC_OpenSession函数中第四个入参connectionMethod,GP规范定义了六种Login Method,OpenTrustee拓展了TEEC_LOGIN_IDENTIFY的类型,且只支持该种connectionMethod。 66 673. 调用TEEC_OpenSession时,TEEC_Operation参数有限制 68 69 在调用TEEC_OpenSession接口时,TEEC_Operation中params[2]和params[3]是预留给系统的,不允许CA使用,CA仅可以使用params[0]和params[1]。 70 71- 支持的CA API列表如下: 72 73| 名称 | 描述 | 74| -------- | -------- | 75| TEEC_InitializeContext (const char \*name, TEEC_Context \*context) | 初始化TEE环境。 | 76| TEEC_FinalizeContext (TEEC_Context \*context) | 关闭TEE环境。 | 77| TEEC_OpenSession (TEEC_Context \*context, TEEC_Session \*session, const TEEC_UUID \*destination, uint32_t connectionMethod, const void \*connectionData, TEEC_Operation \*operation, uint32_t \*returnOrigin) | 打开会话。 | 78| TEEC_CloseSession (TEEC_Session \*session) | 关闭会话。 | 79| TEEC_InvokeCommand (TEEC_Session \*session, uint32_t commandID, TEEC_Operation \*operation, uint32_t \*returnOrigin) | 发送命令。 | 80| TEEC_RegisterSharedMemory (TEEC_Context \*context, TEEC_SharedMemory \*sharedMem) | 注册共享内存。 | 81| TEEC_AllocateSharedMemory (TEEC_Context \*context, TEEC_SharedMemory \*sharedMem) | 申请共享内存。 | 82| TEEC_ReleaseSharedMemory (TEEC_SharedMemory \*sharedMem) | 释放共享内存。 | 83| TEEC_RequestCancellation (TEEC_Operation \*operation) | 取消正在运行的操作。 | 84 85**需注意,业务CA需自行添加selinux策略,否则会出现调用CA API失败。** 86 87## TA开发指导 88 89### TA安装包 90 91TA安装包不需要跟OpenTrustee镜像打包到一起,可以把TA安装包文件放到非安全侧文件系统下。在TA被访问时,由TEE Client将TA安装包发送到OpenTrustee系统中加载运行。 92 93由于TA安装包放在非安全侧文件系统中,需要对TA安装包做签名,保证安装包的完整性。 94 95#### TA安装包路径 96 97TA安装包放在OpenHarmony文件系统下,路径有两种选择。 98 991、将TA安装包命名为uuid.sec(uuid需要替换为TA的真实uuid),放在/vendor/bin目录或者/system/bin目录,OpenTrustee Client会在TA被访问时,自动查找该TA对应的uuid.sec,发送到OpenTrustee系统中加载运行。 100 1012、TA安装包可以自定义文件系统路径,在CA调用TEEC_OpenSession时,通过TEEC_Context的ta_path入参指定该TA安装包的路径,OpenTrustee Client会在指定路径查找该安装包,并发送到OpenTrustee系统中加载运行。 102 103#### TA安装包格式 104 105TA安装包是以“.sec”为后缀名的包文件,文件格式如下:包含文件头、签名块、数据区三部分 106 107 108 109 110 111### TA签名机制 112 113TA签名:由于TA安装包放在非安全侧文件系统中,需要对TA安装包做签名,确保加载到OpenTrustee中的TA安装包没有被篡改。OpenTrustee提供的SDK开发套件中,包含了TA的签名工具,支持对TA安装包一键签名。需要在OpenTrustee SDK开发套件中预置TA签名的私钥。 114 115TA验签:在TA安装包加载到OpenTrustee操作系统中时,由OpenTrustee TA管理框架对TA安装包做签名验证,验证通过之后才允许该TA加载运行。需要在OpenTrustee操作系统中预置TA验签的公钥。 116 117为了方便社区开发者调试,社区的OpenTrustee SDK开发套件已经预置了TA签名私钥,OpenTrustee操作系统中预置了验签的公钥。开发者在OpenTrustee商用版本中应自行替换该签名私钥和验签公钥。 118 119### SDK开发套件 120 121#### 介绍 122 123OpenTrustee提供了SDK开发套件支持独立开发TA,该开发套件集成了TA头文件、TA编译框架、TA签名脚本、demo样例等,目录结构如下: 124 125``` 126├── build 127│ ├── ld # 生成TA ELF文件的链接脚本 128│ ├── mk # TA make编译框架 129│ ├── signkey # TA签名用的私钥 130│ └── tools # 生成TA安装包并对TA签名的脚本 131├── include 132│ └── TA # 给TA提供的TEE头文件 133├── src 134│ └── TA # 放置TA源码和示例 135 └── helloworld_demo # TA helloworld示例 136 └── secstorage_demo # 安全存储示例 137├── thirdparty 138│ └── open_source 139│ └── import_open_source_header.sh # 导入TA编译依赖的musl头文件和安全函数库头文件 140``` 141 142- 开发语言:C语言 143- 代码编辑器:未提供特定编辑器,任意支持C语言开发的编辑器均可 144- SDK执行环境:linux操作系统 145- SDK套件下载地址:https://gitee.com/openharmony-sig/tee_tee_dev_kit 146 147#### 开发套件准备 148 149开发者在使用OpenTrustee SDK开发套件开发TA之前,需要进行一些准备工作。 150 151##### 配置编译工具链 152 153OpenTrustee使用的编译工具链为llvm,与OpenHarmony一致,开发者需要先下载OpenHarmony编译工具链。 154 155首选下载OpenHarmony [build代码仓](https://gitee.com/openharmony/build), 156 157``` 158git clone git@gitee.com:openharmony/build.git 159``` 160 161然后执行该仓中的下载脚本 162 163``` 164./build/prebuilts_download.sh 165``` 166 167下载完成后,需要在当前编译环境中声明llvm编译工具链的路径。可通过如下命令声明编译工具链路径: 168 169``` 170export PATH=openharmony/prebuilts/clang/ohos/linux-x86_64/15.0.4/llvm/bin:$PATH 171``` 172 173该命令仅是示例,开发者需要指定正确的编译工具链路径。 174 175##### 导入第三方头文件 176 177OpenTrustee集成了musl库和安全函数库,TA可以使用这些库。OpenTrustee SDK并没有默认包含musl库和安全函数库的头文件,但是提供了导入的脚本。 178开发者需要先下载[musl库](https://gitee.com/openharmony/third_party_musl)和[安全函数库](https://gitee.com/openharmony/third_party_bounds_checking_function)源码仓: 179 180``` 181git clone git@gitee.com:openharmony/third_party_musl.git 182git clone git@gitee.com:openharmony/third_party_bounds_checking_function.git 183``` 184 185然后执行 186 187``` 188./tee_dev_kit/sdk/thirdparty/open_source/import_open_source_header.sh 189``` 190 191将musl头文件和安全函数库头文件从源码仓导入到OpenTrustee SDK中。 192 193##### 替换TA签名和验签密钥 194OpenTrustee SDK中预置了对TA文件进行签名的私钥,该预置私钥只能用来调试,在商用版本中,开发者需要自行替换该私钥。该私钥路径:tee_dev_kit/sdk/build/signkey/ta_sign_priv_key.pem。同时提供了tee_dev_kit/sdk/build/signkey/ta_sign_algo_config.ini脚本,可以用来对签名算法进行配置。默认的签名算法是RSA,密钥长度4096bit。 195 196如果开发者替换了OpenTrustee SDK中的签名私钥,需要对应替换OpenTrustee操作系统中的验签公钥,验签公钥的路径:tee_os_framework/lib/syslib/libelf_verify_key/src/common/ta_verify_key.c。 197 198##### 工具安装 199 200###### 安装python工具 201 202OpenTrustee SDK中用到了python脚本来完成TA的属性配置文件解析、对TA文件进行签名等操作,因此需要在开发环境上安装python工具。以Ubuntu系统为例,安装命令如下: 203 2041、安装python3 205 206``` 207sudo apt-get update 208sudo apt-get install python3 python3-pip 209``` 210 2112、安装python相关的库,如: 212 213``` 214pip install pycryptodome 215pip install defusedxml 216``` 217 218如果在编译过程中提示缺少其他python库,需要一并安装。 219 220###### 安装openssl工具 221 222OpenTrustee SDK使用openssl工具的签名算法来对TA文件进行签名,需要在开发环境上安装openssl工具。 223 224``` 225sudo apt-get install openssl 226``` 227 228###### 安装make工具 229 230需要在开发环境上安装make工具来对TA源码进行编译。 231 232``` 233sudo apt-get install make 234``` 235 236### TA开发步骤 237 238开发一个新的TA时,需要在tee_dev_kit/sdk/src/TA目录下创建新的TA源码目录,目录结构可以参考该目录下demo示例代码。以helloworld_demo为例,目录结构如下: 239 240``` 241├── helloworld_demo 242 ├── ta_demo.c # TA源码文件 243 ├── configs.xml # TA属性配置文件 244 ├── Makefile # TA编译Makefile 245 ├── build_ta.sh # TA一键生成脚本 246``` 247 248##### TA代码编写 249 250TA代码必须实现如下GP TEE标准规定的入口函数: 251 252| TA入口函数名称 | 函数描述 | 253| -------------------------- | ----------------------------------------------------- | 254| TA_CreateEntryPoint | TA实例的构造函数,每个TA实例的生命周期中只被调用一次 | 255| TA_OpenSessionEntryPoint | 客户端请求创建一个与TA的会话 | 256| TA_InvokeCommandEntryPoint | 客户端在创建会话成功后向TA发送指令 | 257| TA_CloseSessionEntryPoint | 客户端请求关闭与TA的会话 | 258| TA_DestroyEntryPoint | TA示例的析构函数,OpenTrustee在销毁TA实例时调用此函数 | 259 260在客户端访问TA时,OpenTrustee系统会主动调用TA的这些入口函数。详细的参数接口定义请参考TA API章节。代码示例如下: 261``` 262#include <tee_ext_api.h> 263#include <tee_log.h> 264#include <securec.h> 265 266#define TA_TEMPLATE_VERSION "demo_20200601" 267#define PARAM_COUNT 4 268#define OUT_BUFFER_INDEX 3 269 270enum { 271 CMD_GET_TA_VERSION = 1, 272}; 273 274static TEE_Result get_ta_version(char* buffer, size_t *buf_len) 275{ 276 const char *version = TA_TEMPLATE_VERSION; 277 278 if (*buf_len < strlen(version) + 1) { 279 tloge("buffer is too short for storing result"); 280 *buf_len = strlen(version) + 1; 281 return TEE_ERROR_SHORT_BUFFER; 282 } 283 284 errno_t err = strncpy_s(buffer, *buf_len, version, strlen(version) + 1); 285 if (err != EOK) 286 return TEE_ERROR_SECURITY; 287 288 *buf_len = strlen(version) + 1; 289 290 return TEE_SUCCESS; 291} 292 293/** 294 * Function TA_CreateEntryPoint 295 * Description: 296 * The function TA_CreateEntryPoint is the Trusted Application's constructor, 297 * which the Framework calls when it creates a new instance of this Trusted Application. 298 */ 299TEE_Result TA_CreateEntryPoint(void) 300{ 301 tlogd("----- TA entry point ----- "); 302 return TEE_SUCCESS; 303} 304 305/** 306 * Function TA_OpenSessionEntryPoint 307 * Description: 308 * The Framework calls the function TA_OpenSessionEntryPoint 309 * when a client requests to open a session with the Trusted Application. 310 * The open session request may result in a new Trusted Application instance 311 * being created. 312 */ 313TEE_Result TA_OpenSessionEntryPoint(uint32_t parm_type, 314 TEE_Param params[PARAM_COUNT], void** session_context) 315{ 316 (void)parm_type; 317 (void)params; 318 (void)session_context; 319 tlogd("---- TA open session -------- "); 320 321 return TEE_SUCCESS; 322} 323 324/** 325 * Function TA_InvokeCommandEntryPoint 326 * Description: 327 * The Framework calls this function when the client invokes a command 328 * within the given session. 329 */ 330TEE_Result TA_InvokeCommandEntryPoint(void* session_context, uint32_t cmd, 331 uint32_t parm_type, TEE_Param params[PARAM_COUNT]) 332{ 333 TEE_Result ret; 334 (void)session_context; 335 336 tlogd("---- TA invoke command ----------- "); 337 switch (cmd) { 338 case CMD_GET_TA_VERSION: 339 if (!check_param_type(parm_type, 340 TEE_PARAM_TYPE_NONE, 341 TEE_PARAM_TYPE_NONE, 342 TEE_PARAM_TYPE_NONE, 343 TEE_PARAM_TYPE_MEMREF_OUTPUT)) { 344 tloge("Bad expected parameter types"); 345 return TEE_ERROR_BAD_PARAMETERS; 346 } 347 if (params[OUT_BUFFER_INDEX].memref.buffer == NULL || 348 params[OUT_BUFFER_INDEX].memref.size == 0) { 349 tloge("InvokeCommand with bad, cmd is %u", cmd); 350 return TEE_ERROR_BAD_PARAMETERS; 351 } 352 ret = get_ta_version(params[OUT_BUFFER_INDEX].memref.buffer, ¶ms[OUT_BUFFER_INDEX].memref.size); 353 if (ret != TEE_SUCCESS) { 354 tloge("InvokeCommand Failed 0x%x. cmd is %u", ret, cmd); 355 return ret; 356 } 357 break; 358 default: 359 tloge("Unknown cmd is %u", cmd); 360 ret = TEE_ERROR_BAD_PARAMETERS; 361 } 362 363 return ret; 364} 365 366/** 367 * Function TA_CloseSessionEntryPoint 368 * Description: 369 * The Framework calls this function to close a client session. 370 * During the call to this function the implementation can use 371 * any session functions. 372 */ 373void TA_CloseSessionEntryPoint(void* session_context) 374{ 375 (void)session_context; 376 tlogd("---- close session ----- "); 377} 378 379/** 380 * Function TA_DestroyEntryPoint 381 * Description: 382 * The function TA_DestroyEntryPoint is the Trusted Application's destructor, 383 * which the Framework calls when the instance is being destroyed. 384 */ 385void TA_DestroyEntryPoint(void) 386{ 387 tlogd("---- destroy TA ---- "); 388} 389``` 390 391##### TA Makefile编写 392 393TA需要自行编写Makefile文件,可参考SDK中示例代码。有如下要点: 394 395- TA编译生成的目标文件名固定为libcombine.so。 396- 对于64位的TA,需要在Makefile头部增加“TARGET_IS_ARM64 = y”标记;对于32位TA,Makefile中不应包含此标记。 397 398##### TA属性配置 399 400每个TA源码目录下需要包含configs.xml,定义该TA的属性信息。 401 402| 属性名 | 数据类型 | 属性描述 | 系统默认值 | 403| ------------------- | -------- | ------------------------------------------------------------ | ---------- | 404| service_name | String | TA名称,字符串长度不超过64字符,仅支持数字、字母,'_'和'-' | 无 | 405| uuid | UUID | TA唯一标识 | 无 | 406| instance_keep_alive | Bool | 如果为true,表示即使TA所有会话被关闭,TA实例也不会被销毁,全局数据仍然存在,直到TEE运行结束。如果为false,表示若TA所有会话关闭,TA实例会被销毁。 | false | 407| stack_size | Integer | TA每个会话的栈空间大小,需要根据TA实际情况评估 | 8192 | 408| heap_size | Integer | TA实例占用的堆空间大小,需要根据TA实际情况评估 | 0 | 409| multi_session | Bool | TA是否支持同时建立多个会话 | false | 410| single_instance | Bool | TA的多个会话是否归属同一个实例(当前只支持singleInstance为true) | true | 411 412示例如下: 413 414``` 415<ConfigInfo> 416 <TA_Basic_Info> 417 <service_name>demo-ta</service_name> 418 <uuid>e3d37f4a-f24c-48d0-8884-3bdd6c44e988</uuid> 419 </TA_Basic_Info> 420 <TA_Manifest_Info> 421 <instance_keep_alive>false</instance_keep_alive> 422 <stack_size>8192</stack_size> 423 <heap_size>81920</heap_size> 424 <multi_session>false</multi_session> 425 <single_instance>true</single_instance> 426 </TA_Manifest_Info> 427</ConfigInfo> 428``` 429 430##### TA编译和签名 431 432OpenTrustee SDK中提供了TA一键生成脚本,将tee_dev_kit/sdk/build/build_ta.sh拷贝到TA源码目录执行,即完成TA编译、属性配置文件解析、签名等操作,在当前目录生成uuid.sec命名的TA安装包文件。 433 434##### TA规格约束 435 436由于OpenTrustee内存资源有限,因此对TA的资源占用需严格约束。 437 438- TA安装包文件大小,应小于8M,否则会被拒绝加载 439- 单个TA最大会话数量上限为8 440- TA应优化自己的内存占用,避免占用过多内存,导致OpenTrustee系统内存耗尽 441 442### CA/TA鉴权指导 443为了保证TEE会话一旦建立就是可靠的,OpenTrustee提供了鉴权机制。 444具体而言,先使用tee_get_session_type接口获取会话访问类型(CA访问TA 或者 TA访问TA),然后选择相应的验证策略。 445#### CA访问TA 446TA可以在TA_OpenSessionEntryPoint中通过入参params数组获取CA访问者的信息,根据此信息来判断是否创建会话。 447 448对于native ca来说 449- params[2]: CA的uid以及uid size,可通过/proc/ca pid/status查询 450- params[3]: cmdline以及cmdline size,可通过/proc/ca pid/cmdline查询 451 452对于hap来说 453- params[2]: hap证书及证书size 454- params[3]: hap包名及包名size 455 456举个例子,代码如下: 457``` 458#include <tee_ext_api.h> 459 460TEE_Result TA_OpenSessionEntryPoint(uint32_t parm_type, TEE_Param params[PARAM_COUNT], void** session_context) 461{ 462 (void)parm_type; 463 (void)session_context; 464 tlogd("---- TA open session -------- "); 465 466 /* 获取会话类型 */ 467 uint32_t session_type = tee_get_session_type(); 468 469 /* 只允许CA 访问 此TA,并校验CA信息 */ 470 if (session_type == SESSION_FROM_CA) { 471 /* 获取uid */ 472 uint32_t uid = *((uint32_t *)params[2].memref.buffer); 473 /* 获取 CA名称和cmdline长度 */ 474 char *ca_name = (char *)params[3].memref.buffer; 475 size_t ca_name_size = params[3].memref.size; 476 477 /* 预期值 */ 478 uint32_t expected_uid = 0; 479 const char *expected_ca_name = "/vendor/bin/tee_hello"; 480 481 if (uid != expected_uid || strncmp(ca_name, expected_ca_name, ca_name_size) != 0) { 482 tloge("caller has no permission"); 483 return TEE_ERROR_ACCESS_DENIED; 484 } 485 } else { 486 tloge("invalid session type, type = %d", session_type); 487 return TEE_ERROR_BAD_PARAMETERS; 488 } 489 490 /* 初始化其他逻辑,如果需要 */ 491 492 return TEE_SUCCESS; 493} 494``` 495#### TA访问TA 496TA可以在TA_OpenSessionEntryPoint中通过tee_ext_get_caller_info来获取访问者TA的唯一身份信息uuid,并进行验证。示例代码如下: 497``` 498#include <tee_ext_api.h> 499#include <tee_mem_mgmt_api.h> 500 501const TEE_UUID expected_caller_uuid = { 502 0x12345678, 0x1234, 0x1234, {0x12,0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78 } 503}; 504 505TEE_Result TA_OpenSessionEntryPoint(uint32_t parm_type, TEE_Param params[PARAM_COUNT], void** session_context) 506{ 507 (void)parm_type; 508 (void)params; 509 (void)session_context; 510 tlogd("---- TA open session -------- "); 511 512 /* 获取会话类型 */ 513 uint32_t session_type = tee_get_session_type(); 514 515 /* 只允许TA 访问 此TA,并校验TA信息 */ 516 if (session_type == SESSION_FROM_TA) { 517 /* 获取调用者信息 */ 518 caller_info caller_info_data = {0}; 519 TEE_Result res = tee_ext_get_caller_info(&caller_info_data, sizeof(caller_info_data)); 520 if (res != TEE_SUCCESS) 521 return res; 522 523 /* 校验调用者TA的uuid */ 524 if (TEE_MemCompare(&caller_info_data.caller_identity.caller_uuid, &expected_caller_uuid, sizeof(TEE_UUID)) != 0) { 525 tloge("caller has no permission"); 526 return TEE_ERROR_ACCESS_DENIED; 527 } 528 } else { 529 tloge("invalid session type, type = %d", session_type); 530 return TEE_ERROR_BAD_PARAMETERS; 531 } 532 533 /* 初始化其他逻辑,如果需要 */ 534 return TEE_SUCCESS; 535} 536``` 537 538### TEE标准C库支持<a name="ZH-CN_TOPIC_0000001241900905"></a> 539 540支持大多数的POSIX接口,具体支持情况请参考:POSIX: [https://mirror.math.princeton.edu/pub/oldlinux/download/c953.pdf](https://mirror.math.princeton.edu/pub/oldlinux/download/c953.pdf) 541 542支持绝大多数的libc接口。使用musl/libc库,接口支持请参考下表。 543 544> **说明:** 545>- 不支持文件系统、控制台。 546>- 不支持fstat,fsync,writev接口。 547>- stdio中的printf函数目前不支持文件系统,文件操作只支持标准输入输出。 548 549**表 1** 标准C支持列表 550 551<a name="table7336617112614"></a> 552<table><thead align="left"><tr id="row1633681714266"><th class="cellrowborder" valign="top" width="47.88%" id="mcps1.2.3.1.1"><p id="p1653154512717"><a name="p1653154512717"></a><a name="p1653154512717"></a>模块</p> 553</th> 554<th class="cellrowborder" valign="top" width="52.12%" id="mcps1.2.3.1.2"><p id="p1253114512274"><a name="p1253114512274"></a><a name="p1253114512274"></a>函数接口名</p> 555</th> 556</tr> 557</thead> 558<tbody><tr id="row6340121710262"><td class="cellrowborder" rowspan="40" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p18534845102711"><a name="p18534845102711"></a><a name="p18534845102711"></a>pthread</p> 559</td> 560<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p553444592710"><a name="p553444592710"></a><a name="p553444592710"></a>sem_getvalue</p> 561</td> 562</tr> 563<tr id="row10341181782614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p753424552719"><a name="p753424552719"></a><a name="p753424552719"></a>sem_init</p> 564</td> 565</tr> 566<tr id="row534110172268"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1853444542719"><a name="p1853444542719"></a><a name="p1853444542719"></a>sem_post</p> 567</td> 568</tr> 569<tr id="row203411176269"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1553474572712"><a name="p1553474572712"></a><a name="p1553474572712"></a>sem_wait</p> 570</td> 571</tr> 572<tr id="row5341131742616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p10534184519273"><a name="p10534184519273"></a><a name="p10534184519273"></a>pthread_mutex_destroy</p> 573</td> 574</tr> 575<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutex_init</p> 576</td> 577</tr> 578<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutex_lock</p> 579</td> 580</tr> 581<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutex_trylock</p> 582</td> 583</tr> 584<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutex_unlock</p> 585</td> 586</tr> 587<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutexattr_destroy</p> 588</td> 589</tr> 590<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutexattr_init</p> 591</td> 592</tr> 593<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutexattr_setprotocol</p> 594</td> 595</tr> 596<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_mutexattr_settype</p> 597</td> 598</tr> 599<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_spin_destroy</p> 600</td> 601</tr> 602<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_spin_init</p> 603</td> 604</tr> 605<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_spin_lock/p> 606</td> 607</tr> 608<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_spin_trylock</p> 609</td> 610</tr> 611<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_spin_unlock</p> 612</td> 613</tr> 614<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_cond_broadcast</p> 615</td> 616</tr> 617<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_cond_destroy</p> 618</td> 619</tr> 620<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_cond_init</p> 621</td> 622</tr> 623<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_cond_signal</p> 624</td> 625</tr> 626<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_cond_wait</p> 627</td> 628</tr> 629<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_attr_destroy</p> 630</td> 631</tr> 632<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_attr_getstack</p> 633</td> 634</tr> 635<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_attr_getstacksize</p> 636</td> 637</tr> 638<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_attr_init</p> 639</td> 640</tr> 641<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_attr_setstack</p> 642</td> 643</tr> 644<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_attr_setstacksize</p> 645</td> 646</tr> 647<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_create</p> 648</td> 649</tr> 650<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_equal</p> 651</td> 652</tr> 653<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_exit</p> 654</td> 655</tr> 656<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_getspecific</p> 657</td> 658</tr> 659<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_join</p> 660</td> 661</tr> 662<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_key_create</p> 663</td> 664</tr> 665<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_key_delete</p> 666</td> 667</tr> 668<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_once</p> 669</td> 670</tr> 671<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_self</p> 672</td> 673</tr> 674<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_setschedprio</p> 675</td> 676</tr> 677<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>pthread_setspecific</p> 678</td> 679</tr> 680<tr id="row6340121710262"><td class="cellrowborder" rowspan="6" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p18534845102711"><a name="p18534845102711"></a><a name="p18534845102711"></a>malloc</p> 681</td> 682<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p553444592710"><a name="p553444592710"></a><a name="p553444592710"></a>aligned_alloc</p> 683</td> 684</tr> 685<tr id="row10341181782614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p753424552719"><a name="p753424552719"></a><a name="p753424552719"></a>calloc</p> 686</td> 687</tr> 688<tr id="row534110172268"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1853444542719"><a name="p1853444542719"></a><a name="p1853444542719"></a>malloc</p> 689</td> 690</tr> 691<tr id="row203411176269"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1553474572712"><a name="p1553474572712"></a><a name="p1553474572712"></a>realloc</p> 692</td> 693</tr> 694<tr id="row5341131742616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p10534184519273"><a name="p10534184519273"></a><a name="p10534184519273"></a>free</p> 695</td> 696</tr> 697<tr id="row18341101714263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184522712"><a name="p12534184522712"></a><a name="p12534184522712"></a>posix_memalign</p> 698</td> 699</tr> 700<tr id="row18341121732619"><td class="cellrowborder" rowspan="2" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p125341945182720"><a name="p125341945182720"></a><a name="p125341945182720"></a>mman</p> 701</td> 702<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p7534184532717"><a name="p7534184532717"></a><a name="p7534184532717"></a>mmap</p> 703</td> 704</tr> 705<tr id="row534131772614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12534184513273"><a name="p12534184513273"></a><a name="p12534184513273"></a>munmap</p> 706</td> 707</tr> 708<tr id="row434101742618"><td class="cellrowborder" rowspan="3" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p253419457279"><a name="p253419457279"></a><a name="p253419457279"></a>time</p> 709</td> 710<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p16534124510274"><a name="p16534124510274"></a><a name="p16534124510274"></a>gettimeofday</p> 711</td> 712</tr> 713<tr id="row53411917172619"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p11534124522712"><a name="p11534124522712"></a><a name="p11534124522712"></a>strftime</p> 714</td> 715</tr> 716<tr id="row5341101712617"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p19535845152713"><a name="p19535845152713"></a><a name="p19535845152713"></a>time</p> 717</td> 718</tr> 719<tr id="row1334131792612"><td class="cellrowborder" rowspan="6" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p105357458277"><a name="p105357458277"></a><a name="p105357458277"></a>stdio</p> 720</td> 721<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p75354454278"><a name="p75354454278"></a><a name="p75354454278"></a>printf</p> 722</td> 723</tr> 724<tr id="row63421517192616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p2535154592716"><a name="p2535154592716"></a><a name="p2535154592716"></a>scanf</p> 725</td> 726</tr> 727<tr id="row83421817132613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p105351045132712"><a name="p105351045132712"></a><a name="p105351045132712"></a>snprintf</p> 728</td> 729</tr> 730<tr id="row434291782619"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12535545132715"><a name="p12535545132715"></a><a name="p12535545132715"></a>sprintf</p> 731</td> 732</tr> 733<tr id="row19342517122616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p3535245132711"><a name="p3535245132711"></a><a name="p3535245132711"></a>vsnprintf</p> 734</td> 735</tr> 736<tr id="row1342161792613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p353518454270"><a name="p353518454270"></a><a name="p353518454270"></a>vsprintf</p> 737</td> 738</tr> 739<tr id="row734291715264"><td class="cellrowborder" rowspan="2" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p13535045172712"><a name="p13535045172712"></a><a name="p13535045172712"></a>errno</p> 740</td> 741<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p25351645132719"><a name="p25351645132719"></a><a name="p25351645132719"></a>errno</p> 742</td> 743</tr> 744<tr id="row11342181711269"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p11535164515276"><a name="p11535164515276"></a><a name="p11535164515276"></a>strerror</p> 745</td> 746</tr> 747<tr id="row5342151710264"><td class="cellrowborder" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p10535945152714"><a name="p10535945152714"></a><a name="p10535945152714"></a>exit</p> 748</td> 749<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p8535124519274"><a name="p8535124519274"></a><a name="p8535124519274"></a>abort</p> 750</td> 751</tr> 752<tr id="row11342117182611"><td class="cellrowborder" rowspan="2" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p85358458277"><a name="p85358458277"></a><a name="p85358458277"></a>unistd</p> 753</td> 754<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p1753517452273"><a name="p1753517452273"></a><a name="p1753517452273"></a>getpid</p> 755</td> 756</tr> 757<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p1753517452273"><a name="p1753517452273"></a><a name="p1753517452273"></a>gettid</p> 758</td> 759</tr> 760<tr id="row1034281772615"><td class="cellrowborder" rowspan="4" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p1553514592714"><a name="p1553514592714"></a><a name="p1553514592714"></a>locale</p> 761</td> 762<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p753574512278"><a name="p753574512278"></a><a name="p753574512278"></a>setlocale</p> 763</td> 764</tr> 765<tr id="row334220171263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p115353451276"><a name="p115353451276"></a><a name="p115353451276"></a>strcoll</p> 766</td> 767</tr> 768<tr id="row13343151762618"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p95351145142716"><a name="p95351145142716"></a><a name="p95351145142716"></a>strxfrm</p> 769</td> 770</tr> 771<tr id="row173433172262"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p0535104512273"><a name="p0535104512273"></a><a name="p0535104512273"></a>strtod</p> 772</td> 773</tr> 774<tr id="row2343131732614"><td class="cellrowborder" rowspan="3" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p95351945132716"><a name="p95351945132716"></a><a name="p95351945132716"></a>multibyte</p> 775</td> 776<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p25351345122715"><a name="p25351345122715"></a><a name="p25351345122715"></a>mbrtowc</p> 777</td> 778</tr> 779<tr id="row1234321772614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p185354453273"><a name="p185354453273"></a><a name="p185354453273"></a>wcrtomb</p> 780</td> 781</tr> 782<tr id="row7343151762613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p115361445112716"><a name="p115361445112716"></a><a name="p115361445112716"></a>wctob</p> 783</td> 784</tr> 785<tr id="row1034351714262"><td class="cellrowborder" rowspan="4" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p135361645112710"><a name="p135361645112710"></a><a name="p135361645112710"></a>prng</p> 786</td> 787<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p19536134517272"><a name="p19536134517272"></a><a name="p19536134517272"></a>srandom</p> 788</td> 789</tr> 790<tr id="row73431717102610"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p17536134518272"><a name="p17536134518272"></a><a name="p17536134518272"></a>initstate</p> 791</td> 792</tr> 793<tr id="row17343181742615"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p2536144515271"><a name="p2536144515271"></a><a name="p2536144515271"></a>setstate</p> 794</td> 795</tr> 796<tr id="row16343121711263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p185362459278"><a name="p185362459278"></a><a name="p185362459278"></a>random</p> 797</td> 798</tr> 799<tr id="row63431217102612"><td class="cellrowborder" rowspan="17" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p1153618451278"><a name="p1153618451278"></a><a name="p1153618451278"></a>string</p> 800</td> 801<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p1553620456277"><a name="p1553620456277"></a><a name="p1553620456277"></a>memchr</p> 802</td> 803</tr> 804<tr id="row93431217112613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p14536154510275"><a name="p14536154510275"></a><a name="p14536154510275"></a>memcmp</p> 805</td> 806</tr> 807<tr id="row17344417112619"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p153684515275"><a name="p153684515275"></a><a name="p153684515275"></a>memcpy</p> 808</td> 809</tr> 810<tr id="row1934421712265"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1653694592712"><a name="p1653694592712"></a><a name="p1653694592712"></a>memmove</p> 811</td> 812</tr> 813<tr id="row934411712267"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p2536114510274"><a name="p2536114510274"></a><a name="p2536114510274"></a>memset</p> 814</td> 815</tr> 816<tr id="row163441117142619"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p105361345112715"><a name="p105361345112715"></a><a name="p105361345112715"></a>strchr</p> 817</td> 818</tr> 819<tr id="row1434451715262"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p175366451279"><a name="p175366451279"></a><a name="p175366451279"></a>strcmp</p> 820</td> 821</tr> 822<tr id="row534471762616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p353694514273"><a name="p353694514273"></a><a name="p353694514273"></a>strcpy</p> 823</td> 824</tr> 825<tr id="row334461752611"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1753694515274"><a name="p1753694515274"></a><a name="p1753694515274"></a>strlen</p> 826</td> 827</tr> 828<tr id="row834419172265"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p0536745102720"><a name="p0536745102720"></a><a name="p0536745102720"></a>strncmp</p> 829</td> 830</tr> 831<tr id="row1734415175268"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p55361345192717"><a name="p55361345192717"></a><a name="p55361345192717"></a>strncpy</p> 832</td> 833</tr> 834<tr id="row183445174264"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p115365457273"><a name="p115365457273"></a><a name="p115365457273"></a>strnlen</p> 835</td> 836</tr> 837<tr id="row1534401712611"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p19537245112712"><a name="p19537245112712"></a><a name="p19537245112712"></a>strrchr</p> 838</td> 839</tr> 840<tr id="row13451617142620"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p125371456272"><a name="p125371456272"></a><a name="p125371456272"></a>strstr</p> 841</td> 842</tr> 843<tr id="row15345181762614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p95371845142718"><a name="p95371845142718"></a><a name="p95371845142718"></a>wcschr</p> 844</td> 845</tr> 846<tr id="row10345151718267"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p0537124512279"><a name="p0537124512279"></a><a name="p0537124512279"></a>wcslen</p> 847</td> 848</tr> 849<tr id="row2345111710263"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p145371645142718"><a name="p145371645142718"></a><a name="p145371645142718"></a>wmemchr</p> 850</td> 851</tr> 852<tr id="row12345131715263"><td class="cellrowborder" rowspan="13" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p753714502717"><a name="p753714502717"></a><a name="p753714502717"></a>ctype</p> 853</td> 854<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p5537145142720"><a name="p5537145142720"></a><a name="p5537145142720"></a>isalpha</p> 855</td> 856</tr> 857<tr id="row1434581792614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p0537184511274"><a name="p0537184511274"></a><a name="p0537184511274"></a>isascii</p> 858</td> 859</tr> 860<tr id="row5345417182620"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p8537114513278"><a name="p8537114513278"></a><a name="p8537114513278"></a>isdigit</p> 861</td> 862</tr> 863<tr id="row8345117122618"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p8537204582712"><a name="p8537204582712"></a><a name="p8537204582712"></a>islower</p> 864</td> 865</tr> 866<tr id="row034551782617"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p253716455273"><a name="p253716455273"></a><a name="p253716455273"></a>isprint</p> 867</td> 868</tr> 869<tr id="row4345101713267"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1053713455279"><a name="p1053713455279"></a><a name="p1053713455279"></a>isspace</p> 870</td> 871</tr> 872<tr id="row16345201752616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p853764562716"><a name="p853764562716"></a><a name="p853764562716"></a>iswctype</p> 873</td> 874</tr> 875<tr id="row33455179264"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p18537114522715"><a name="p18537114522715"></a><a name="p18537114522715"></a>iswdigit</p> 876</td> 877</tr> 878<tr id="row83461317192614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p16537154512710"><a name="p16537154512710"></a><a name="p16537154512710"></a>iswlower</p> 879</td> 880</tr> 881<tr id="row93461117152620"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p353713458276"><a name="p353713458276"></a><a name="p353713458276"></a>iswspace</p> 882</td> 883</tr> 884<tr id="row19346161711268"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p75371145202717"><a name="p75371145202717"></a><a name="p75371145202717"></a>iswupper</p> 885</td> 886</tr> 887<tr id="row123461517162613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p3537245152710"><a name="p3537245152710"></a><a name="p3537245152710"></a>towupper</p> 888</td> 889</tr> 890<tr id="row1734671714268"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p175381245172715"><a name="p175381245172715"></a><a name="p175381245172715"></a>towlower</p> 891</td> 892</tr> 893<tr id="row6346117112615"><td class="cellrowborder" rowspan="16" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p2538174512714"><a name="p2538174512714"></a><a name="p2538174512714"></a>math</p> 894</td> 895<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p19538184572712"><a name="p19538184572712"></a><a name="p19538184572712"></a>atan</p> 896</td> 897</tr> 898<tr id="row8346131782613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p15381945172717"><a name="p15381945172717"></a><a name="p15381945172717"></a>ceil</p> 899</td> 900</tr> 901<tr id="row734617176261"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p953844582716"><a name="p953844582716"></a><a name="p953844582716"></a>ceilf</p> 902</td> 903</tr> 904<tr id="row134610174264"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p053824511271"><a name="p053824511271"></a><a name="p053824511271"></a>copysignl</p> 905</td> 906</tr> 907<tr id="row13346917152610"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p13538104522717"><a name="p13538104522717"></a><a name="p13538104522717"></a>exp</p> 908</td> 909</tr> 910<tr id="row334661712269"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p5538154512710"><a name="p5538154512710"></a><a name="p5538154512710"></a>fabs</p> 911</td> 912</tr> 913<tr id="row2347181722616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p2538184522716"><a name="p2538184522716"></a><a name="p2538184522716"></a>floor</p> 914</td> 915</tr> 916<tr id="row123471517122616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1453874562717"><a name="p1453874562717"></a><a name="p1453874562717"></a>frexp</p> 917</td> 918</tr> 919<tr id="row153471917112616"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p14538134512271"><a name="p14538134512271"></a><a name="p14538134512271"></a>frexpl</p> 920</td> 921</tr> 922<tr id="row234771717261"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p10538245102714"><a name="p10538245102714"></a><a name="p10538245102714"></a>log</p> 923</td> 924</tr> 925<tr id="row1334711179265"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p185381245142719"><a name="p185381245142719"></a><a name="p185381245142719"></a>log2</p> 926</td> 927</tr> 928<tr id="row103471317132612"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p20538144512275"><a name="p20538144512275"></a><a name="p20538144512275"></a>pow</p> 929</td> 930</tr> 931<tr id="row133472178262"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p35389459277"><a name="p35389459277"></a><a name="p35389459277"></a>roundf</p> 932</td> 933</tr> 934<tr id="row234731713261"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p4538154522715"><a name="p4538154522715"></a><a name="p4538154522715"></a>scalbn</p> 935</td> 936</tr> 937<tr id="row1347917182619"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p85381845192718"><a name="p85381845192718"></a><a name="p85381845192718"></a>scalbnl</p> 938</td> 939</tr> 940<tr id="row1134717178267"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p11538845102718"><a name="p11538845102718"></a><a name="p11538845102718"></a>sqrt</p> 941</td> 942</tr> 943<tr id="row13348101715261"><td class="cellrowborder" rowspan="14" align="left" valign="top" width="47.88%" headers="mcps1.2.3.1.1 "><p id="p195391445102713"><a name="p195391445102713"></a><a name="p195391445102713"></a>stdlib</p> 944</td> 945<td class="cellrowborder" valign="top" width="52.12%" headers="mcps1.2.3.1.2 "><p id="p1153954552713"><a name="p1153954552713"></a><a name="p1153954552713"></a>abs</p> 946</td> 947</tr> 948<tr id="row4348101732615"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1853910450272"><a name="p1853910450272"></a><a name="p1853910450272"></a>atof</p> 949</td> 950</tr> 951<tr id="row12348111782617"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p12539124562717"><a name="p12539124562717"></a><a name="p12539124562717"></a>atoi</p> 952</td> 953</tr> 954<tr id="row123482178261"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p95391945102713"><a name="p95391945102713"></a><a name="p95391945102713"></a>atol</p> 955</td> 956</tr> 957<tr id="row163481117142610"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p35391745172718"><a name="p35391745172718"></a><a name="p35391745172718"></a>atoll</p> 958</td> 959</tr> 960<tr id="row6348217132613"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p4539164511276"><a name="p4539164511276"></a><a name="p4539164511276"></a>bsearch</p> 961</td> 962</tr> 963<tr id="row12348191714269"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p195391245102717"><a name="p195391245102717"></a><a name="p195391245102717"></a>div</p> 964</td> 965</tr> 966<tr id="row1634810170260"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p10539124513274"><a name="p10539124513274"></a><a name="p10539124513274"></a>ecvt</p> 967</td> 968</tr> 969<tr id="row103481517182617"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p75392457277"><a name="p75392457277"></a><a name="p75392457277"></a>imaxabs</p> 970</td> 971</tr> 972<tr id="row1834817175260"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p854014552719"><a name="p854014552719"></a><a name="p854014552719"></a>llabs</p> 973</td> 974</tr> 975<tr id="row1349121792612"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p1154054562718"><a name="p1154054562718"></a><a name="p1154054562718"></a>qsort</p> 976</td> 977</tr> 978<tr id="row15349117192614"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p14540645172719"><a name="p14540645172719"></a><a name="p14540645172719"></a>strtoul</p> 979</td> 980</tr> 981<tr id="row134910176267"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p135401445172712"><a name="p135401445172712"></a><a name="p135401445172712"></a>strtol</p> 982</td> 983</tr> 984<tr id="row183494173268"><td class="cellrowborder" valign="top" headers="mcps1.2.3.1.1 "><p id="p3540114519272"><a name="p3540114519272"></a><a name="p3540114519272"></a>wcstod</p> 985</td> 986</tr> 987</tbody> 988</table> 989 990### TEE支持的安全函数<a name="ZH-CN_TOPIC_0000001241780915"></a> 991 992#### 安全函数库介绍<a name="section11575152912113"></a> 993 994遵循C11 Annex K \(Bounds-checking interfaces\)的标准,选取并实现了常见的内存/字符串操作类的函数,如memcpy\_s、strcpy\_s等函数。 995 996具体可以参考[安全函数库](https://gitee.com/openharmony-sig/tee_tee_dev_kit/blob/master/docs/opentrustee-guidelines/opentrustee-security-driver-guidelines.md#安全函数库) 997 998#### 函数清单<a name="section986312451913"></a> 999 1000- memcpy\_s 1001- memmove\_s 1002- memset\_s 1003- strcpy\_s 1004- strncpy\_s 1005- strcat\_s 1006- strncat\_s 1007- strtok\_s 1008- snprintf\_s 1009- vsnprintf\_s