• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2
3# OpenTrustee CA/TA开发指南
4
5## CA/TA访问机制
6
7OpenTrustee应用分为CA(客户端应用)和TA(可信应用)。OpenTrustee支持CA访问TA,也支持TA访问TA。TA采用命令响应机制,交互流程如下:
8
9![](figures/ca-ta.png)
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
18![](public_sys-resources/icon-note.gif)OpenTrustee的实现遵循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![](figures/storage-format-of-ta.png)
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![](public_sys-resources/icon-warning.gif)为了方便社区开发者调试,社区的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.c197
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, &params[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.so396- 对于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>![](public_sys-resources/icon-note.gif) **说明:**
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