(6)normal

  normal类的函数是多的,这类函数的特点是没有固定和活性参数,所以我们不能通过判断其参数来对其进行进一步的处理,对于这类函数的出现,我们将按照规定的危险等级直接进行报警。

  (7)sprintf类和strncpy类函数

  如strncpy(dst,src,n)中,n为活性参数,如果n为sizeof(dst)-1或strlen(src)+1的话是不会产生漏洞的,如果n为sizeof(dst)的话则有可能产生漏洞,有可能不产生漏洞,这依赖于src和下一行代码的情况,如果下一行代码能见到dst[sizeof(dst)-1]=’’样的表达形式,或者src为字符串的话(“src”),则不会产生漏洞,否则可以判定函数使用会出现漏洞。

  二、分析算法模块

  首先看一个使用文件资源的代码段为示例:

 

void fun ( )
{
  1: File f = fopen ( “c:\test.txt”,rw) ;
  2: fclose (f) ;
}

 

  人工分析的过程:

  a)若是需要检查文件资源泄露,需要定位到文件句柄的打开部分,锁定风险API:fopen。

  b)记录下该API返回的文件句柄,变量f。以便跟踪该句柄的使用情况。

  c)发现在行号2,f作为参数,被API fclose引用,而fclose恰好是与fopen对应的API操作,表示文件句柄的关闭。

  在此,对于这个文件资源的检测完毕。结论: 没有资源泄露

  根据以上分析,只需要定位关键API,并跟踪相应的变量使用即可。进一步,考虑下面这段带有条件分支的代码段:

 

void fun ( )
{
  1: File f = fopen ( ” c:\test.txt”, rw ) ;
  2: if (fRet)
{
  3: return;
}
  4: fclose ( f) ;
}

  若是根据之前的原则分析,依然得出没有错误的结论,然而可以看到,在行号3处,有一个return语句,这将直接导致函数退出。在这个退出分支中,打开的文件句柄没有得到关闭,必然造成资源泄露。

  反思一下分析过程,显然忽略了这么一个事实: fopen的操作是顺次必然执行的, 但其对应的fclose 操作则是受到if( fRet)语句控制,在其后的false控制分支中执行。对于open操作,并不是所有的退出分支都有close操作,所以导致了文件资源的泄露。

  将对控制条件的处理引入分析:

  a)定位关键API fopen。

  b)跟踪返回的句柄,变量f。

  c)定位关键API fclose对变量f的引用。

  d)比较fopen与fclose是否处在同一逻辑分支。