0

我正在编写一个解析器,在进行转换时,我无法区分普通类类型和数组类类型。

拥有类似于以下内容的内容会对我有很大帮助:

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) {中,因为数组类实际上没有名称字段。我真的没有办法告诉类变量被初始化的类型。
4

1 回答 1

3

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

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

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


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

于 2013-10-20T06:35:23.030 回答