c++ - 为什么这会导致 nodejs 崩溃

标签 c++ node.js

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/

相关文章:

c++ - boost mpl 将每个元素包装在一个集合中

c++ - 同一个互斥锁上有很多锁,一个锁永远

c++ - 在 OCR 中检测边界框?

javascript - 使用 JavaScript 调用 Node.js 后端函数的最有效方法是什么

node.js - 导入时无法在模块外部使用 import 语句 "uuid"

c++ - 函数括号后的 -> 符号表示什么?

c++ - 在 while 条件中声明变量的一些方法?

javascript - 在普通 Node 中实现队列的好方法是什么?

javascript - 使用 gulp-usemin 不会在 html 文件中重写丑化文件

node.js - 在 node-mysql 的 where 子句中使用数组