【发布时间】:2023-03-25 22:13:01
【问题描述】:
我有一个 C 文件
int func(int i) {
return i;
}
int main() {
int i;
int j = func(i);
return j;
}
当我尝试通过命令
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.
显然这个变量确实没有初始化。当我去探索clang是如何发出这个警告的时候,我发现是通过Diagnostics。 clang的代码如下:
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); ^
【问题讨论】: