邢台做网站推广的公司是哪家?,百度云在线登录,网站建设logo要什么格式,效果图制作网站本章目录 前言什么是安全函数#xff1f;安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1#xff1a;strcpy_s 和 strcat_s示例 2#xff1a;memcpy_s示例 3#xff1a;strtok_s 总结 … 本章目录 前言什么是安全函数安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1strcpy_s 和 strcat_s示例 2memcpy_s示例 3strtok_s 总结 前言
在 C 语言的编程中缓冲区溢出是常见的安全问题之一。它发生在程序尝试将数据写入一个不足够大的缓冲区时导致数据覆盖了相邻内存区域。这种错误不仅会导致程序崩溃还可能导致潜在的安全漏洞使攻击者能够通过精心设计的输入数据控制程序流甚至执行恶意代码。
为了避免这类问题C11 标准引入了一些 “安全函数”通常称为 Annex K 函数这些函数是传统 C 函数的增强版本增加了缓冲区大小检查和错误处理机制从而提升了程序的安全性。
本文将带您深入了解 C 语言中的安全函数帮助您编写更加健壮和安全的代码。 什么是安全函数
在 C 语言中安全函数是指那些在执行字符串和内存操作时显式检查目标缓冲区大小并报告错误的函数。它们的设计初衷是防止缓冲区溢出、访问越界等问题。安全函数通常返回一个 errno_t 类型的错误码以便调用者能够检测是否成功执行。
安全函数的特点
缓冲区大小检查安全函数需要明确传递目标缓冲区的大小确保不会发生溢出。返回值检查大多数安全函数返回一个错误代码可以通过检查返回值来判断是否成功执行。错误处理当缓冲区大小不足或者其他错误发生时安全函数会尝试清空或初始化输出缓冲区避免未定义的行为。
主要的安全函数
以下是 C 语言中一些常见的安全函数及其传统函数对比
1. 字符串操作安全函数 strcpy_s安全版本的 strcpy复制字符串并检查目标缓冲区的大小。 errno_t strcpy_s(char *dest, rsize_t destsz, const char *src);strcat_s安全版本的 strcat将源字符串追加到目标字符串末尾并检查缓冲区大小。 errno_t strcat_s(char *dest, rsize_t destsz, const char *src);strncpy_s安全版本的 strncpy复制最多 n 个字符并检查缓冲区大小。 errno_t strncpy_s(char *dest, rsize_t destsz, const char *src, rsize_t count);strncat_s安全版本的 strncat追加最多 n 个字符到目标字符串末尾并检查缓冲区大小。 errno_t strncat_s(char *dest, rsize_t destsz, const char *src, rsize_t count);strtok_s安全版本的 strtok引入上下文参数解决线程安全问题。 char *strtok_s(char *str, const char *delim, char **context);2. 格式化输出安全函数 sprintf_s安全版本的 sprintf格式化输出到字符串时检查缓冲区大小。 int sprintf_s(char *buffer, rsize_t sizeOfBuffer, const char *format, ...);snprintf_s安全版本的 snprintf格式化输出时限制字符数并检查缓冲区大小。 int snprintf_s(char *buffer, rsize_t sizeOfBuffer, const char *format, ...);vsprintf_s安全版本的 vsprintf接收 va_list 参数列表并检查缓冲区大小。 int vsprintf_s(char *buffer, rsize_t sizeOfBuffer, const char *format, va_list argptr);3. 内存操作安全函数 memcpy_s安全版本的 memcpy复制内存时检查目标缓冲区大小。 errno_t memcpy_s(void *dest, rsize_t destsz, const void *src, rsize_t count);memmove_s安全版本的 memmove允许内存区域重叠并检查目标缓冲区大小。 errno_t memmove_s(void *dest, rsize_t destsz, const void *src, rsize_t count);memset_s安全版本的 memset填充内存并检查目标缓冲区大小。 errno_t memset_s(void *dest, rsize_t destsz, int ch, rsize_t count);4. 其他常用安全函数 _itoa_s 和 _ultoa_s安全版本的整数转换函数。 errno_t _itoa_s(int value, char *buffer, size_t sizeOfBuffer, int radix);
errno_t _ultoa_s(unsigned long value, char *buffer, size_t sizeOfBuffer, int radix);_strlwr_s 和 _strupr_s将字符串转换为小写或大写的安全版本。 errno_t _strlwr_s(char *str, size_t numberOfElements);
errno_t _strupr_s(char *str, size_t numberOfElements);安全函数实例
下面通过一些简单的示例展示如何使用 C 的安全函数来提高代码的健壮性避免缓冲区溢出问题。
示例 1strcpy_s 和 strcat_s
#include stdio.h
#include string.hint main() {char dest[20]; // 目标缓冲区大小为 20const char *src Hello, World!;// 使用 strcpy_s 将 src 复制到 destif (strcpy_s(dest, sizeof(dest), src) ! 0) {printf(strcpy_s failed!\n);return 1; // 返回错误代码} else {printf(After strcpy_s: %s\n, dest);}// 使用 strcat_s 将 C Language 追加到 destconst char *appendStr C Language;if (strcat_s(dest, sizeof(dest), appendStr) ! 0) {printf(strcat_s failed!\n);return 1; // 返回错误代码} else {printf(After strcat_s: %s\n, dest);}return 0;
}输出
After strcpy_s: Hello, World!
strcat_s failed!在这个示例中strcpy_s 成功将字符串复制到目标缓冲区但由于 dest 缓冲区的大小不足以容纳追加的内容strcat_s 返回错误并防止溢出。
示例 2memcpy_s
#include stdio.h
#include string.hint main() {char src[] Sensitive Data;char dest[15]; // 目标缓冲区大小为 15// 使用 memcpy_s 将数据复制到 destif (memcpy_s(dest, sizeof(dest), src, strlen(src) 1) ! 0) {printf(memcpy_s failed!\n);return 1; // 返回错误代码} else {printf(After memcpy_s: %s\n, dest);}return 0;
}输出
After memcpy_s: Sensitive Datamemcpy_s 确保 dest 缓冲区足够大以容纳源字符串的所有数据。如果缓冲区不够函数会返回错误并防止执行不安全的内存复制。
示例 3strtok_s
#include stdio.h
#include string.hint main() {char str[] apple,orange,banana;char *token;char *context NULL;// 使用 strtok_s 分割字符串token strtok_s(str, ,, context);while (token ! NULL) {printf(Token: %s\n, token);token strtok_s(NULL, ,, context);}return 0;
}输出
Token: apple
Token: orange
Token: banana在这个例子中strtok_s 使用上下文参数来避免多线程环境下的安全问题。每次调用都不会影响其他线程中的字符串分割。 总结
C 语言中的安全函数是为了提高代码的安全性而设计的尤其是在防止缓冲区溢出、内存越界等常见错误方面提供了有效的防护。通过使用这些函数您可以确保程序在处理字符串和内