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

  • 相关阅读:
    。。。Hibernate 查询数据 事务管理。。。
    如何在easyui datagrid 中显示外键的值
    easyui datagrid 中序列化后的日期格式化
    使用Log4net把日志写入到SqlServer数据库
    在ALV点击Key值调用TCode,跳过初始屏幕
    JAVA环境变量设置
    在Jsp中调用静态资源,路径配置问题
    eclipse下项目复制改名注意事项
    HTML5与CSS3基础教程第八版学习笔记16-21章
    HTML5与CSS3基础教程第八版学习笔记11~15章
  • 原文地址:https://www.cnblogs.com/yuzhenjin/p/14218167.html
Copyright © 2011-2022 走看看