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

  • 相关阅读:
    github上fork的项目,如何同步原作者更新的内容?
    设计模式-简单工厂模式详解
    设计模式-建造者模式详解
    设计模式-原型模式详解
    设计模式-单例模式详解
    SqlServer断开所有连接
    Winform重写键盘按键事件
    从拖拉控件编程到面向设计编程(一)
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    java 微信自定义菜单 java微信接口开发 公众平台 SSM redis shiro 多数据源
  • 原文地址:https://www.cnblogs.com/yuzhenjin/p/14218167.html
Copyright © 2020-2023  润新知