Linux系统下怎么检测不也许使用的非安全函数

1. 为什么要检测非安全函数

C语言中非安全的经典函数(比如字符串操作类函数)如果使用不当可能会引发一些问题,最好在项目组禁止使用。

常见的函数有以下这些:

  • strcpy/wcscpy/stpcpy/ wcpcpy
  • scanf/ sscanf /vscanf /fwscanf /swscanf/ wscanf
  • gets/ puts
  • strcat /wcscat
  • wcrtomb /wctob
  • sprintf/ vsprintf /vfprintf
  • asprintf/ vasprintf
  • strncpy /wcsncpy
  • strtok/ wcstok
  • strdupa /strndupa
  • 其它一些不允许使用的函数等

2. 怎么做到

2.1 一般做法

定时检测最新的源码,如果发现有异常,让对应的开发人员进行修正. 缺点是显而易见的的,很可能有漏网之鱼

能否做到如果代码中有这些函数就编译不通过,这样强迫大家在提交代码之前修改?

2.2 应用编译器的posion功能

uses the #pragma GCC poison directive to define a number of identifiers (function names) as unsafe. Compilation will fail if these are present in your code.

3. example

Step1: 在下面poison.h的基础上根据项目组具体情况修改

//这个文件需要根据项目具体情况进行适度调整
#ifdef __GNUC__

/* String handling functions */
# pragma GCC poison strcpy wcscpy stpcpy wcpcpy
# pragma GCC poison scanf sscanf vscanf fwscanf swscanf wscanf
# pragma GCC poison gets puts
# pragma GCC poison strcat wcscat
# pragma GCC poison wcrtomb wctob
# pragma GCC poison sprintf vsprintf vfprintf
# pragma GCC poison asprintf vasprintf
# pragma GCC poison strncpy wcsncpy
# pragma GCC poison strtok wcstok
# pragma GCC poison strdupa strndupa

/* Signal related */
# pragma GCC poison longjmp siglongjmp
# pragma GCC poison setjmp sigsetjmp

/* Memory allocation */
# pragma GCC poison alloca
# pragma GCC poison mallopt

/* File API's */
# pragma GCC poison remove
# pragma GCC poison mktemp tmpnam tempnam
# pragma GCC poison getwd

/* Misc */
# pragma GCC poison getlogin getpass cuserid
# pragma GCC poison rexec rexec_af

/* Your custom insecure APIs here */
//# pragma GCC poison iEatLargeStrings

#endif

Step2: 在源码文件(最好是最底层的功能头文件包含这个文件) #include "poison.h"

PS: gcc和交叉编译器都适合,唯一需要注意的地方是如果有开源组件使用了的话需要注意了.

原文地址:https://www.cnblogs.com/yuzhenjin/p/14218167.html