首页 > 解决方案 > Clang 断言失败:用尽源位置

问题描述

我有一个使用 Clang 的 LibTooling 框架来解析 AST 并执行静态代码分析的实用程序。我正在使用 LLVM 和 Clang v10.0。

最近我观察到该实用程序从未完成对特定文件的 AST 的解析。在调试时,我观察到 SourceManager.cpp 由于断言失败而调用中止。具体位置在这里:

FileID SourceManager::createFileID(const ContentCache *File,
                                   SourceLocation IncludePos,
                                   SrcMgr::CharacteristicKind FileCharacter,
                                   int LoadedID, unsigned LoadedOffset) {
...
...
assert(NextLocalOffset + FileSize + 1 > NextLocalOffset &&
         NextLocalOffset + FileSize + 1 <= CurrentLoadedOffset &&
         "Ran out of source locations!");
...
...
...
}

断言失败时变量的值分别为:NextLocalOffset=2147335549,FileSize=303516,CurrentLoadedOffset=2147483648,(NextLocalOffset + FileSize)=2147639065。

源文件是自动生成的,大小约为 28,268,746 字节 (~27MB),包含多个用于内存映射不同代码块的包含指令 (~7000)。

Clang 可以处理的源文件大小是否有限制?

标签: clangllvmllvm-clangclang-static-analyzerlibtooling

解决方案


推荐阅读