分段错误C ++转换问题

时间:2013-10-20 04:54:21

标签: c++ parsing segmentation-fault

我正在编写一个解析器,并且在进行转换时,我在正常的类类型和数组类类型之间出现问题。

有类似下面的内容对我有很大帮助:

if (expression causes segmentation fault)
  do sth
else
  do sth else

如果不是这样,那么将两个类彼此区分的好方法是什么?

if (base->type->GetType() != "") {
char *key = strcpy(key, base->type->GetType().c_str());
     Node *node = (stack->front).Lookup(key);

    if (node != NULL) {
      theclass = dynamic_cast<ClassDeclaration *>(node);
    }

   if (!base->GetType()->IsEquivalentTo(GetType()))
      errReport.FieldNotFoundInBase(field, type);*/
   if (theclass->id->name){ // segfault happens here.
  • 变量theclass有时被初始化为实际类,有时也被初始化为数组。当存在数组类而不是实际类时,seg错误发生在行if (theclass->id->name) {中,因为数组类实际上没有名称字段。我真的没有办法告诉正在初始化类变量的类型。

1 个答案:

答案 0 :(得分:3)

如果nodeClassDeclaration的实例,则dynamic_cast<ClassDeclaration *>(node)会将node“转换”为ClassDeclaration* [1]。否则,它会返回0 (或者更确切地说,nullptr会转为ClassDeclaration*

您不检查nullptr值。取消引用nullptr几乎肯定会出现段错误(虽然从技术上说它是UB,所以它可以做任何事情。)

现在,有可能会发生更深奥的事情并且因为dynamic_cast失败并返回nullptr而没有发生段错误,然后您继续取消引用该值。这是可能的。如果您检查了返回值,我们都知道。


注1:dynamic_cast可能会更改指针值,例如,如果强制转换类型不是乘法继承对象的第一个基本类型。所以我可能不应该在“转换”这个词周围加上恐慌引用。