【问题标题】:How does clang Diagnostics get source code?clang 诊断如何获取源代码?
【发布时间】: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 时,我收到类似的警告

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);
             ^ 

【问题讨论】:

    标签: clang llvm


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2013-10-24
      • 2011-06-13
      相关资源
      最近更新 更多