叮当诊断如何获取源代码?



我有一个C文件

int func(int i) {
return i;
}
int main() {
int i;
int j = func(i);
return j;
}

当我尝试通过命令编译器ask.c时,我收到类似

ask.c:7:18: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
int j = func(i);
^
ask.c:6:10: note: initialize the variable 'i' to silence this warning
int i;
^
= 0
1 warning generated.

显然,这个变量确实没有初始化。当我去探索叮当是如何发出这个警告的时,我发现它是通过诊断的。叮当的代码如下:

S.Diag(Use.getUser()->getBeginLoc(), diag::warn_uninit_var)
<< VD->getDeclName() << IsCapturedByBlock
<< Use.getUser()->getSourceRange();

在 Diagnostic*Kinds.td 中定义:

def warn_uninit_var : Warning<
"variable %0 is uninitialized when %select{used here|captured by block}1">,
InGroup<Uninitialized>, DefaultIgnore;

导出的信息在这里输出,但让我惊讶的是,还输出了错误位置的源代码。clang 如何输出错误位置的源代码?

int j = func(i);
^ 

clang::Sema(您的变量SS.Diag)可以访问clang::SourceManager,而又可以访问所有输入文件的所有原始字节,以及在需要时懒惰扩展的非文件宏扩展缓冲区。诊断打印机使用源管理器接口将clang::SourceLocation转换为 file:line:col 以及指向原始字节的指针,以便它可以打印该行,以及查询源管理器以获取宏实例化堆栈或遵循的 #include 指令(如果适用)。

最新更新