background image

  
  lcase_fname=estrndup(fname,fname_len);
  
  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()
风格的格式化和变量参数列表式样。