Skip to content

Segmentation fault in non_cad mode during fix_geo: invalid tan_fid in collect_kring_neighbors_given_fid #4

Description

@HYXU6

Hi Ningna,您好!

首先非常感谢您开源并维护 MATTopo,这个项目对我们目前的研究工作帮助很大。

我在使用 non_cad 模式 测试 MATTopo 时,遇到了一个稳定可复现的 segmentation fault。目前已经通过 gdb 基本定位到问题根源,想向您确认这是已知问题,还是我这边使用方式不当。


复现方式

使用 non_cad 模式运行,例如:

./bin/MATTOPO Ours_3000.msh 30 non_cad 0.1

程序可以顺利完成以下阶段:

  • 四面体网格(.msh)加载
  • sharp / concave feature 检测
  • RPD(GPU)计算
  • medial mesh 构建
  • surface sampling

随后在 fix_geo / shrink 阶段发生 segmentation fault。


gdb 定位结果

使用 gdb 得到的 backtrace 显示,崩溃稳定发生在以下调用链中:

SurfaceMesh::collect_kring_neighbors_given_fid
TangentConcaveLine::update_covered_sf_fids
TangentConcaveLine::TangentConcaveLine
MedialSphere::update_tan_cc_lines_from_ss_params
shrink_post_process
shrink_sphere
add_new_sphere_given_v2fid
check_and_fix_mm_geo

实际的崩溃点出现在 std::set::clear() 内部,表现为非法内存访问。


一些关键发现

在 SurfaceMesh::collect_kring_neighbors_given_fid() 中,参数 tan_fid 经常取到明显非法的值,例如:

  • -1
  • 非常大的正整数(如 10^9 量级)

而在当前 surface mesh 中,合法范围应当是:

0 <= tan_fid < sf_mesh.facets.nb()

我在该函数中加入了简单的防护检查:

if (tan_fid < 0 || tan_fid >= sf_mesh.facets.nb()) {
    std::cerr << "[WARN] invalid tan_fid=" << tan_fid << std::endl;
    return false;
}

加入后可以看到大量 warning 输出,随后程序仍会在 fix_geo 后续阶段崩溃,说明这是一个系统性问题,而非偶发错误。


当前理解(希望向您确认)

从调用关系和行为来看,问题可能源于:

  • TangentConcaveLine 内部保存的 tan_fid
  • 在 fix_geo / shrink 过程中,medial spheres / feature lines 被删除、合并或重建
  • 但部分 TangentConcaveLine 对象仍然持有已经失效的 surface face id

从而在后续的 k-ring neighbor 查询中触发非法内存访问并最终 segfault。


想请教的问题
1. 在 non_cad 模式 下,fix_geo 阶段是否默认假设输入 surface 的拓扑在此阶段保持稳定?
2. TangentConcaveLine / tan_fid 在 shrink / fix 过程中,是否需要额外的生命周期管理或刷新机制?
3. 这个问题是否是当前代码中已知但尚未修复的情况?是否有推荐的 workaround(例如在 non_cad 模式下临时跳过某类 CC line 或 fix_geo 子流程)?

非常感谢您的时间和指导!如果需要更详细的日志、backtrace 或测试数据,我可以进一步补充。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions