c++ - 调用基类变量时出现段错误

标签 c++ segmentation-fault clang llvm

我已经在项目中使用这段代码很长时间了。但是,我最近将 llvm-config --cxxflags --libs 添加到编译器中,以便与 llvm 库链接,并且它开始生成 seg 错误。我已经找到了错误,当我调用基类的变量时,它发生了。

这是我正在做的一个小例子 在 Literals.hh

class LiteralObj : public RuleObj {

public:

  LiteralObj();
  LiteralObj(char *str);
  ~LiteralObj();
  std::string raw_value;

  static int literalobj_cnt;
  int literalobj_id;
};

class LiteralIntObj : public LiteralObj{

public:

  LiteralIntObj();
  LiteralIntObj(char *str);
  ~LiteralIntObj();
  
  void graphVis(std::ofstream &ofs, std::string &srcRef);

  CODE_GENERATION;
  
  int value;
};

文字.cc

LiteralObj::LiteralObj() : RuleObj(){
  ENTER_STATEMENT

    raw_value = "";

    literalobj_id = literalobj_cnt;
    literalobj_cnt++;

}

LiteralObj::LiteralObj(char *str) : RuleObj(){
    ENTER_STATEMENT
    std::cerr << ruleobj_id << "\n";
    raw_value     = str;
    literalobj_id = literalobj_cnt;
    literalobj_cnt++;
}

LiteralObj::~LiteralObj()
{
  ENTER_STATEMENT;
}

LiteralIntObj::LiteralIntObj() : LiteralObj()
{
   ENTER_STATEMENT;
   value = 0;               
}
LiteralIntObj::LiteralIntObj(char *str) : LiteralObj(str)
{ 
  
  ENTER_STATEMENT; 
  std::cerr << ruleobj_id << '\n';
  value = stoi(raw_value);
}

LiteralIntObj::~LiteralIntObj()
{
  ENTER_STATEMENT;
}

void LiteralIntObj::graphVis(std::ofstream &ofs, std::string &srcRef) {
  ENTER_GRAPHVIS;

  // -- define names
  std::string currRef  = "LiteralIntObj";
  std::string name     = "LiteralInt";

  std::cerr << raw_value << "\n";
  //it crashes here with SEGFAULT.

}

对于第一个对象,代码可以很好地打印出基类的 raw_value,但是,当调用第二个对象时,会生成 SEGMENTATION 错误。

最佳答案

当我更改编译选项时,指针默认设置为 0xffffffff 而不是 0。因此,即使指针未初始化,检查 if (pointer) 也会生成 true,从而导致调用函数 graphViz().

关于c++ - 调用基类变量时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62993060/

相关文章:

c++ - 我可以使用reduce代替for循环吗?

c++ - 重载问题

c - 有没有更好的方法来确保矩阵之外的元素不被访问?

c++ - 在递归 lambda 中按值捕获

c++ - 从专门化访问模板参数

c++ - clang 的 'range-loop-analysis' 诊断是关于什么的?

c++ - 如何在 gcc 或 clang 中启用从 int 到 int64_t 的转换警告

c++ - Clang AST 将对 make_unique 的调用与特定类匹配

c++ - 将 IP 与主机/网络地址列表进行比较

c++ - valgrind 未检测到的 malloc_consolidate (malloc.c) 中的段错误