Skip to content

iRT存在double free和core dump问题 #15

@WennyAhhh

Description

@WennyAhhh

运行环境

iEDA docker

测例

我并非使用标准的数字流程,而是仅使用Lef、Def完成布线流程,相关数据因为NDA无法提供。

问题

由于布线资源较为紧张,会产生大量违例。 在运行5个小时并跑完10次布线迭代完成之后,出现core dump错误或者是double free,依据rt.log和gdb我找到错误的函数为

void DataManager::updateViolationToGCellMap(ChangeType change_type, Violation* violation)

其中的violation指针已经为空,但是依然进行了free。

  if (change_type == ChangeType::kDel) {
    delete violation;
    violation = nullptr;
  }

我通过增加以下判断指针是否为空规避了这个问题,此后再跑此处就没有问题。

  if (violation == nullptr) {
    return;
  }

本可以提交pr完成debug修复,但是我仔细研究了一下布线算法,发现其在处理violation时某一函数存在数据竞争问题。以下函数在并发环境下在RTDM中删除violation,即便我可以看到dr_box已经做了错位处理以避免相邻并发单元互相冲突,但是在违例较多的情况下,是否依然存在数据竞争?

void DetailedRouter::buildViolation(DRBox& dr_box)

所以我认为以上的判断语句仅能修复我的例子,或许并不能根本解决我遇到的问题。此问题已经超出了我个人修bug的范围,望开发组可以看一下这个问题。如果我的表述存在问题,希望批评指正。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions