1. 程式人生 > 實用技巧 >Linux系統下怎麼檢測不也許使用的非安全函式

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和交叉編譯器都適合,唯一需要注意的地方是如果有開源元件使用了的話需要注意了.