zoukankan      html  css  js  c++  java
  • 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和交叉编译器都适合,唯一需要注意的地方是如果有开源组件使用了的话需要注意了.

  • 相关阅读:
    Livepool
    Eclipse最新版注释模板设置详解
    hashcode详解
    开发集成工具MyEclipse中Outline的问题
    第三章 数据链路层(二)
    Java常考面试题(四)
    collections集合的总括。
    第三章 数据链路层(一)
    Java常考面试题(三)
    Java常考面试题(二)
  • 原文地址:https://www.cnblogs.com/yuzhenjin/p/14218167.html
Copyright © 2011-2022 走看看