sql_varying 的 case 语句导致 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;
}
}
下面是如何为 sql_varying 分配 sqldata:
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: 进一步调试后,我确定错误是由以下行引起的:
if(var->sqlind != 0) delete var->sqlind;
如果我将其替换为:
if(var->sqltype & 1) delete var->sqlind;
在代码的某处,sqlind是这样分配的:
if(var->sqltype & 1){
var->sqlind = new short(-1);
}
用新行替换旧行修复了问题,nodejs 不再崩溃。您是否认为旧行导致它崩溃是因为 sqlind 被分配给了 new short(-1),我猜这是 null 的标记?
最佳答案
错误现已修复。 var->sqldata 未初始化为 0,这导致删除 var->sqldata 始终运行,即使在空引用上也会导致 Node 崩溃。
关于c++ - 为什么这会导致 nodejs 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9762616/