2012-03-18 115 views
1

sql_varying的case语句导致nodejs因分段错误而崩溃。为什么会发生这种崩溃nodejs

void FBResult::clean_sqlda(XSQLDA *sqlda) 
    { 
    int i; 
    XSQLVAR* var; 
    for(i = 0, var= sqlda->sqlvar; i < sqlda->sqld;i++,var++) 
    { 
     switch(var->sqltype & ~1) 
     { 
     case SQL_ARRAY: 
     case SQL_BLOB:  delete (ISC_QUAD*) var->sqldata; break; 
     case SQL_TIMESTAMP: delete (ISC_TIMESTAMP*) var->sqldata; break; 
     case SQL_TYPE_TIME: delete (ISC_TIME*) var->sqldata; break;         
     case SQL_TYPE_DATE: delete (ISC_DATE*) var->sqldata; break;        
     case SQL_TEXT:  
     case SQL_VARYING: delete [] var->sqldata; break; 
     case SQL_SHORT:  delete (int16_t *) var->sqldata; break; 
     case SQL_LONG:  delete (int32_t *) var->sqldata; break; 
     case SQL_INT64:  delete (int64_t *) var->sqldata; break; 
     case SQL_FLOAT:  delete (float *) var->sqldata; break; 
     case SQL_DOUBLE: delete (double *) var->sqldata; break; 
     default:   return;      
     } 
     if(var->sqlind != 0) delete var->sqlind; 
    } 
    } 

这里是SQLDATA的分配方式sql_varying:

case SQL_VARYING: var->sqldata = new char[var->sqllen + 3]; 
         memset(var->sqldata, 0, 2); 
         memset(var->sqldata + 2, ' ', var->sqllen); 
         var->sqldata[var->sqllen + 2] = '\0'; 
         break; 

为什么在clean_sqlda事业的的NodeJS线崩溃?如果我注释掉这条线并重建扩展名,它不会崩溃。该行假定清除分配给var-> sqldata的内存。我如何解决它?

编辑:SQL_TEXT分配是这样的:

case SQL_TEXT:  var->sqldata = new char[var->sqllen + 1]; 
          memset(var->sqldata, ' ', var->sqllen); 
          //memset(var->sqldata, 0, var->sqllen); 
          var->sqldata[var->sqllen] = '\0'; 
          break; 

不过,我不认为我使用SQL_TEXT任何地方(虽然不知道)。

编辑#2: 进一步调试之后,我确定该错误是由行引起的:在代码,sqlind

if(var->sqltype & 1) delete var->sqlind; 

某处:

if(var->sqlind != 0) delete var->sqlind; 

如果我将其替换为分配如下:

if(var->sqltype & 1){ 
     var->sqlind = new short(-1); 
     } 

用新的li替换旧的行ne解决了这个问题,nodejs不再崩溃。你认为旧行导致它崩溃,因为sqlind被分配给新的short(-1),这是我猜的空标记吗?

+0

编辑显示sql_text分配。 – firebird 2012-03-18 22:12:09

回答

1

该错误现在已修复。 var-> sqldata未用0​​初始化,这导致删除var-> sqldata始终运行,即使在空引用导致节点崩溃。

+0

指针语言的常见错误。始终初始化指针。 – 2012-10-30 16:36:54

0

你决定分配的是(var-> sqltype & 1),而你的免费决定是(var-> sqlind!= 0)。如果我是你,我会认为这种不匹配会导致崩溃。

可能的进一步原因:var-> sqlind未在不需要分配的代码路径中初始化。

0

sqltype最低有效位用于指示值是否可以是 null。
如果它被设置,sqlind被分配,并且它的值指示它是否 null(值-1为null,0为非null)。

因此,在您分配或取消分配时测试该位的条件应该是(var->sqltype & 1)