Linux系統下怎麼檢測不也許使用的非安全函式
阿新 • • 發佈:2020-12-31
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和交叉編譯器都適合,唯一需要注意的地方是如果有開源元件使用了的話需要注意了.