Hexagon LLVM编译架构介绍(12)

240 篇文章 11 订阅

3.5 警告和错误信息

LLVM 提供了多种方法来控制哪些代码构造导致编译器发出错误和警告消息,以及这些消息如何显示到控制台。

3.5.1 控制诊断的显示方式

当 LLVM 发出诊断信息时,它会在输出中包含丰富的信息,并让您可以精细控制打印哪些信息。 LLVM 能够打印此信息。 以下选项用于控制信息:

  • 一个文件/行/列指示符,它准确地显示了代码 [ -fshow-column , -fshow-source-location ] 中发生诊断的位置。
  • 诊断分类为注释、警告、错误或致命错误。
  • 描述问题的文本字符串。
  • 指示如何控制诊断的选项(对于支持它的诊断)[ -fdiagnostics-show-option ]。
  • 诊断的高级类别,用于希望按类(对于支持它的诊断)对诊断进行分组的客户端 [ -fdiagnostics-show-category ]。
  • 出现问题的源代码行,以及指示重要位置的插入符号和范围 [ -fcaret-diagnostics ]。
  • “FixIt”信息,简要说明如何修复问题
    (当 LLVM 确定它知道时)[ -fdiagnostics-fixit-info ]。
  • 所涉及范围的机器可解析表示(默认情况下禁用)[ -fdiagnostics-print-source-range-info ]。

3.5.2 诊断映射

所有诊断都映射到以下类别之一:

■ Ignored
■ Note
■ Warning
■ Error
■ Fatal

3.5.3 诊断类别

虽然默认情况下未显示,但每个诊断都可以与一个高级类别相关联。 此类别旨在使分类生成以分组方式生成大量错误或警告的构建成为可能。

默认情况下不显示类别,但可以使用 -fdiagnostics-show-category 选项(第 3.4.7 节)打开它们。 当此选项设置为“名称”时,类别以文本形式打印在诊断输出中。 设置为“id”时,将打印类别编号。

注意:
可以通过使用选项 --print-diagnostic-categories 调用 LLVM 来获得类别名称到类别标识符的映射。

3.5.4 使用编译器选项控制诊断

-W 标志、 -pedantic 等

3.5.5 使用编译指示控制诊断

LLVM 还可以通过在源代码中使用编译指示来控制启用哪些诊断。 这对于禁用源代码部分中的特定警告很有用。 LLVM 支持 GCC 的编译指示,以便与现有源代码以及多个扩展兼容。

pragma 可以控制可以从命令行使用的任何警告。 警告可以设置为忽略、警告、错误或致命。 以下示例指示 LLVM 或 GCC 忽略 -Wall 警告:

#pragma GCC diagnostic ignored "-Wall"

除了 GCC 编译指示提供的所有功能外,LLVM 还使您能够推送和弹出当前警告状态。 这在编写将由其他人编译的头文件时特别有用,因为您不知道他们构建的警告标志是什么。

在下面的示例中 -Wmultichar 仅被一行代码忽略,之后诊断返回到先前存在的任何状态:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"

char b = 'df'; // no warning.

#pragma clang diagnostic pop

push 和 pop 编译指示保存和恢复编译器的完整诊断状态,不管它是如何设置的。 这意味着可以在 GCC 兼容的诊断中使用 push 和 pop,并且 LLVM 将适当地推送和弹出它们,而 GCC 将忽略推送和弹出作为未知的编译指示。

注意:
虽然 LLVM 支持 GCC pragma,但 LLVM 和 GCC 不支持同一组警告。 因此,即使使用 GCC 兼容的编译指示,也不能保证它们在两个编译器上具有相同的行为。

3.5.6 控制系统标题中的诊断

警告在系统标题中出现时会被抑制。 默认情况下,如果在 -isystem 指定的包含路径中找到包含文件,则将其视为系统标头,但这可以通过多种方式覆盖。

system_header 编译指示可用于将当前文件标记为系统头文件。 在同一文件中,从 pragma 的位置开始不会产生警告。

char a = 'xy'; // warning#pragma clang system_header

char b = 'ab'; // no warning

选项 -isystem-prefix 和 -ino-system-prefix 可用于覆盖是否将包含路径的子集视为系统标头。 当 #include 指令中的名称在标头搜索路径中找到并以系统前缀开头时,标头将被视为系统标头。 命令行上与指定头名称匹配的最后一个前缀优先。 例如:

$ hexagon-clang -Ifoo -isystem bar -isystem-prefix x/ 
-ino-system-prefix x/y/

这里,#include " x/ah " 被视为包含系统头,即使在 foo 中找到头,而 #include “x/y/bh” 被视为不包含系统头,即使头是 在酒吧里找到。

如果包含文件被视为系统标头,则查找与当前目录相关的文件的 #include 指令将被视为包含系统标头。

3.5.7 启用所有警告

除了传统的 -W 标志外,所有警告都可以通过指定选项 -Weverything 来启用。

-Weverything 与 -Werror 一起按预期工作,还包括来自 -pedantic 的警告。

注意:
当此选项与 -w(禁用所有警告)一起使用时,-w 优先。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值