background image

  
  

zend_str_tolower(lcase_fname,fname_len);

  
 

 

if(zend_hash_find(EG(function_table)

lcase_fname

fname_len+1

(void**)&fe)==FAILURE){
  
  

zend_execute(fe->op_arrayTSRMLS_CC);

  
  

}else{

  
   

php_error_docref(NULLTSRMLS_CC , E_ERROR , "Calltoundefinedfunction:

%s()",fname);
  
  

}

  
  

efree(lcase_fname);

  
  

}

  
    当 执 行 到

php_error_docref() 这 一 行 时 , 内 部 错 误 处 理 器 就 会 明 白 该 错 误 级 别 是

critical,并相应地调用 longjmp()来中断当前程序流程并离开 call_function()函数,甚至根本
不会执行到

efree(lcase_fname)这一行。你可能想把 efree()代码行移动到 zend_error()代码行的

上面

;但是,调用这个 call_function()例程的代码行会怎么样呢?fname 本身很可能就是一个

分配的字符串,并且,在它被错误消息处理使用完之前,你根本不能释放它。
  
  注意,这个

php_error_docref()函数是 trigger_error()函数的一个内部等价实现。它的第一

个参数是一个将被添加到

docref 的可选的文档引用。第三个参数可以是任何我们熟悉的 E_*

家族常量,用于指示错误的严重程度。第四个参数

(最后一个)遵循 printf()风格的格式化和变

 

量参数列表式样。