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),这是我猜的空标记吗?
编辑显示sql_text分配。 – firebird 2012-03-18 22:12:09