在学习C语言的过程中,我经常会遇到一些资源,建议永远不要使用某些功能(例如gets()),因为它们很难或不可能安全使用.

如果C标准库包含许多"从不使用"的函数,那么似乎有必要了解它们的列表,什么使它们不安全,以及如何取而代之.

到目前为止,我已经了解了以下功能:

  • 无法防止重写内存
  • 不保证以null结尾字符串
  • 在通话之间保持内部状态

通常被认为使用是不安全的.是否有显示这些行为的函数列表?有没有其他类型的功能不可能安全使用?

推荐答案

在过go ,大多数字符串函数都没有边界判断.当然,他们不能简单地删除旧函数,或者修改签名以包含上限,这会 destruct 兼容性.现在,对于这些函数中的几乎每个函数,都有一个可选的"n"版本.例如:

strcpy -> strncpy
strlen -> strnlen
strcmp -> strncmp
strcat -> strncat
strdup -> strndup
sprintf -> snprintf
wcscpy -> wcsncpy
wcslen -> wcsnlen

还有更多.

另请参见第https://github.com/leafsr/gcc-poison节,它是一个创建头文件的项目,如果您使用不安全的函数,该文件会导致GCC报告错误.

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

使用sscanf获取零个或多个长度的字符串

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

GTK函数调用将完全不相关的char* 值搞乱

在C中访问数组中的特定值

按长度对argv中的单词进行排序

如何在不使用字符串的情况下在c中编写函数atof().h>;

运行时错误:在索引数组时加载类型为';char';`的空指针

安全倒计时循环

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

有没有一种方法可以用C创建保留限定符的函数?

用C++高效解析HTTP请求的方法

如何摆脱-WIMPLICIT-Function-声明

用于计算位数和的递归C函数

如何组合两个宏来初始化C语言中的字符串数组?

生成的头文件不包括用户定义的文件

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

If语句默认为true

使用 _Atomic float 时,MSVC 编译的代码会命中调试断言

在链表中插入一个值