ARM嵌入式编译器控制诊断信息(warning/error)

news2024/9/25 21:18:41

ARM编译器以警告(warning)和错误(error)的形式来提供编译诊断信息,并且用户可以通过一些命令行选项,来控制这些warnings和errors的打开或者关闭。编译器会在程序编译和链接过程中将遇到的warnings和errors在控制终端打印出来,如果用户有多个源代码文件,当errors被发现时,编译器只会报告第一个源文件的诊断信息。 

目录

1 armclang诊断信息的格式

2 armclang常用的控制诊断消息的选项

3 使用示例

4 使用 pragma控制诊断信息

5 armasm 和 armlink的消息格式

6 armasm, armlink, armar, fromelf等工具控制诊断消息选项

--brief_diagnostics

--diag_error=[,]...

--diag_remark=[,]...

--diag_style=arm|ide|gnu

--diag_suppress=[,]...

--diag_warning=[,]...

--errors=

--remarks

7 参考文章


1 armclang诊断信息的格式

 armclang遇到warning或者error时,其诊断信息的格式如下

:<file>:<line>:<col>: <type>: <message>
  • <file> :出现error 或者 warning 的源文件名字
  • <line> : 出现error 或者 warning时的行号
  • <col> : 出现error 或者 warning时的列号
  • <type> : 消息类型,比如可以为:error 或者 warning
  • <message> : 具体的消息详情,该文本可能以-W<flag>形式的诊断标志结束,例如-Wvla-extension,用来标识error 或者 warning。只有可以抑制(suppress)的消息才具有关联标志。无法抑制的错误没有关联标志。

 比如下面的warning消息示例:

file.c:8:7: warning: variable length arrays are a C99 feature [-Wvla-extension]
 int i[n];
      ^

 该warning信息会告诉用户:

警告发生在file.c文件的第8行第7列开始的地方,警告是关于 i[n] 的,即在声明数组是,使用变量作为数组的长度,这个做法在当前编译器看来是个警告。在消息的最后也告诉了用户控制这个waring的flag是 vla-extension ,是因为用了[-Wvla-extension] 编译选项才打开该flag的warning信息,所以如果想要禁止此类行为产生waring消息,可以使用[-Wno-vla-extension] 选项。

2 armclang常用的控制诊断消息的选项

Common diagnostic options
OptionDescription
-Werror将所有警告转换为错误。
-Werror=<flag>将警告标志<flag>变为错误。
-Wno-error=<flag>即使指定了-Werror,也保留警告标志<flag>作为警告。
-W<flag>启用警告标志<flag>。
-Wno-<flag>禁止警告标志<flag>。
-w禁止所有警告。注意,这个选项是小写的w。
-Weverything打开所有警告。
-Wpedantic如果代码违反严格的ISO C和ISO c++,则生成警告。
-pedantic如果代码违反严格的ISO C和ISO c++,则生成警告。
-pedantic-errors如果代码违反严格的ISO C和ISO c++,则生成错误。
-f[no-]color-diagnostics该选项控制Clang是否以彩色打印诊断信息,当检测到支持彩色的终端时,默认为打开。
-f[no-]diagnostics-show-hotness在诊断行中启用配置文件热度信息(hotness)。
-f[no-]diagnostics-fixit-info启用诊断输出中的FixIt信息。这个选项(默认为on)控制Clang是否在它知道如何修复特定诊断的情况下打印信息。

3 使用示例

比如有一个file.c文件如下:

#include <stdlib.h>
#include <stdio.h>

void function (int x) {
  int i;
  int y=i+x;

/* 第三个 %d 缺少对应参数*/
  printf("Result of %d plus %d is %d\n", i, x); 
/* call这个函数在当前文件中没有被声明过,所以是隐式声明 (implicit declaration)*/
  call(); 

  return;
}

 当使用如下命令进行编译时:

armclang --target=aarch64-arm-none-eabi -march=armv8 -c file.c

 默认情况下,编译器会检查 printf() 函数声明的格式,确保 % 与传入的参数个数是否匹配,因此armclang会报如下警告信息:

file.c:9:36: warning: more '%' conversions than data arguments [-Wformat]
  printf("Result of %d plus %d is %d\n", i, x);
                                   ^

此外,在默认情况下,对 .c 文件,armclang使用 gnu11 的标准进行编译,该语言标准不支持隐式函数声明,因此会报如下警告:

file.c:11:3: warning: implicit declaration of function 'call' is invalid C99 [-Wimplicit-function-declaration]
  call();
  ^

关闭所有warning, 使用 -w:

armclang --target=aarch64-arm-none-eabi -march=armv8-a -c file.c -w

关闭 -Wformat 带来的warning, use -Wno-format:

armclang --target=aarch64-arm-none-eabi -march=armv8-a -c file.c -Wno-format

将 -Wformat 消息产生的warning作为 error报告, use -Werror=format:

armclang --target=aarch64-arm-none-eabi -march=armv8-a -c file.c -Werror=format

默认情况下,某些诊断消息被抑制。查看所有诊断消息, use -Weverything:

armclang --target=aarch64-arm-none-eabi -march=armv8-a -c file.c -Weverything

4 使用 pragma控制诊断信息

除了在armclang命令行中添加诊断消息选项,armclang还支持在源代码中添加选项,详情可以参考文档:Clang Compiler User’s Manual — Clang 17.0.0git documentationhttps://clang.llvm.org/docs/UsersManual.html#controlling-errors-and-warnings

Clang还可以通过在源代码中使用pragma来控制启用哪些诊断。这对于关闭源代码部分中的特定警告非常有用。为了与现有源代码兼容,Clang支持GCC的pragma,以及一些扩展。pragma可以控制任何可以从命令行使用的警告。警告可以设置为忽略、警告、错误或致命。下面的示例代码将告诉Clang或GCC忽略-Wall警告: 

#pragma GCC diagnostic ignored "-Wall"

#pragma clang diagnostic ignored "-W<name>"
// 忽略由<name>指定的诊断消息。

#pragma clang diagnostic warning "-W<name>"
// 将<name>指定的诊断消息设置为警告级别。

#pragma clang diagnostic error "-W<name>"
// 将<name>指定的诊断消息设置为error 级别。

#pragma clang diagnostic fatal "-W<name>"
// 将<name>指定的诊断消息设置为致命错误 fatal error 级别。

#pragma clang diagnostic push
// 保存诊断状态,以便恢复。

#pragma clang diagnostic pop
// 恢复上次保存的诊断状态。

用户也可以使用命令行选项 -W<name>来禁止或更改消息的级别,但是该更改适用于整个编译,而不是当前源文件。

关于 push 和 pop的操作,可以看如下示例:

#if foo
#endif foo /* no warning when compiling with -Wextra-tokens */

#pragma clang diagnostic push
#pragma clang diagnostic warning "-Wextra-tokens"

#if foo
#endif foo /* warning: extra tokens at end of #endif directive */

#pragma clang diagnostic pop

 当使用如下命令编译时:

armclang --target=arm-arm-none-eabi -march=armv7-a -c foo.c -o foo.o -Wno-extra-tokens

编译器只会对第二个 #endif foo 示例发出警告:

foo.c:8:8: warning: extra tokens at end of #endif directive [-Wextra-tokens]

#endif foo /* warning: extra tokens at end of #endif directive */
       ^
       //
1 warning generated.

5 armasm 和 armlink的消息格式

 armasm 和 armlink的消息格式如下:

type: prefix id suffix: message_text
  • <type>, 有以下类型选项:
    • Internal fault :  内部故障,内部故障表示工具内部出现问题。请与您的供应商联系并提供反馈。
    • Error:错误表示导致工具停止的问题。
    • Warning:警告表示异常情况可能表明存在问题,但该工具仍在继续。
    • Remark:备注,备注是常用的工具用法,但有时不符合常规。默认情况下不显示这些诊断信息。工具继续运行。
  • <prefix>, 有以下类型选项:
    • A - armasm
    • L - armlink or armar
    • Q - fromelf
  • <id>,唯一的数字消息标识符。
  • <suffix>,消息的类型:
    • E - Error
    • W - Warning
    • R - Remark
  • <message_text>,消息内容。

比如下面的armlink的错误消息:

Error: L6449E: While processing /home/scratch/a.out: I/O error writing file '/home/scratch/a.out': Permission denied

详情可以参考文档:

Arm Compiler for Embedded Errors and Warningshttps://developer.arm.com/documentation/100074/0620/Linker-Errors-and-Warnings/List-of-the-armlink-error-and-warning-messages

6 armasmarmlinkarmar, fromelf等工具控制诊断消息选项

--brief_diagnostics

armasm only。使用较短形式的诊断输出。原始的源行不显示,并且当错误消息文本太长而不能放在单行中时,错误消息文本不会被换行。

--diag_error=<tag>[,<tag>]...

将指定的诊断消息设置为“错误”。使用 --diag_error=warning 可以将所有的warning当作error.

--diag_remark=<tag>[,<tag>]...

将指定的诊断消息设置为Remark级别。

--diag_style=arm|ide|gnu

指定诊断消息的显示样式

--diag_suppress=<tag>[,<tag>]...

禁止指定的诊断信息. 使用 --diag_suppress=error 将禁止所有可以被降级的error, 或者使用 --diag_suppress=warning 可以关闭所有的warning。降低诊断消息的级别可能会阻止工具报告重要错误。Arm建议,除非用户了解对软件的影响,否则不要降低诊断的级别。

--diag_warning=<tag>[,<tag>]...

将指定的诊断消息设置为警告级别。使用--diag warning=error 将设置所有可以降级错误为警告。

--errors=<filename>

将诊断消息的输出重定向到指定文件。

--remarks

armlink only. 启用 remark 消息的显示。

7 参考文章

Arm Compiler for Embedded Errors and Warningshttps://developer.arm.com/documentation/100074/0620/Linker-Errors-and-Warnings/List-of-the-armlink-error-and-warning-messages

Controlling diagnostic messageshttps://developer.arm.com/documentation/100748/0620/Using-Common-Compiler-Options/Controlling-diagnostic-messages?lang=en Clang Compiler User’s Manual — Clang 17.0.0git documentationhttps://clang.llvm.org/docs/UsersManual.html#controlling-errors-and-warnings

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开关电源基础03:正激和反激开关电源拓扑(1)-正激拓扑

说在开头&#xff1a;关于薛定谔的波动方程&#xff08;2&#xff09; 全新的量子理论诞生不到一年&#xff0c;很快面临着粒子和波动的内战。矩阵力学从直接观测到的原子谱线出发&#xff0c;引入矩阵的数学工具&#xff0c;建立了整个新力学的大厦&#xff1b;它强调观测到的…

大数据Doris(十三):Duplicate数据模型以及聚合模型的局限性

文章目录 Duplicate数据模型以及聚合模型的局限性 一、Duplicate数据模型 二、聚合模型的局限性 Duplicate数据模型以及聚合模型的局限性 一、Duplicate数据模型 在某些多维分析场景下&#xff0c;数据既没有主键&#xff0c;也没有聚合需求&#xff0c;只需要将数据原封不…

JDK17新特性之--新的Compact Strings(JEP 254)

前言 JDK9将String底层的数据结构从private final char value[];改成了private final byte[] value; &#xff0c; JEP 254: Compact Strings(紧凑字符串)&#xff0c;这要修改的目的就是为了节省空间1。我们先看一下JDK9和JDK8中String源码的变化。 JDK9中String源码&#xf…

深度学习技巧应用12-神经网络训练中批归一化的应用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用12-神经网络训练中批归一化的应用,在深度学习中,批归一化(Batch Normalization,简称BN)是一种重要的技巧,它在许多神经网络中都得到了广泛应用。本文将详细介绍批归一化的原理和应用,并结合PyTorch框架构建一个简…

法规标准-SAE J2802标准解读

SAE J2802是做什么的&#xff1f; SAE J2802全名为盲点监测系统&#xff08;BSMS&#xff09;&#xff1a;工作特性和用户界面&#xff0c;其中主要是对BSMS系统的工作特性及用户界面进行了介绍 BSMS目标 强制性目标 任何可获得公路许可的车辆&#xff0c;此处视为大于125 …

深入浅出二叉树— C语言版【数据结构】

目录 ​编辑 1.树概念及结构 1.1树的概念 1.2 树的相关概念 ​1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 简单二叉树题目练习 2.5 二叉树的存储结构 2.5.1 顺序存储——堆 2.5.2 链式存储 1.树概念及结构 1.1树的概念 树…

Java --- String类

&#xff08;一&#xff09;String java.lang.String 类代表字符串。Java 程序中所有的字符串文字&#xff08;例如 "hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创建之后不能更改。 字符串 St…

深度卷积图神经网络(Deep Convolutional Graph Neural Network,DCGNN)的基本概念与应用

目录 一、引言 1.1 神经网络的发展历程 1.2 图神经网络的出现 二、深度卷积图神经网络的基本概念 2.1 图的表示 2.2 图卷积神经网络 2.3 深度卷积图神经网络 三、深度卷积图神经网络的应用 3.1 图像分类 3.2 图像分割 3.3 图像生成 四、深度卷积图神经网络的优缺点 …

【数据结构与算法】图的概述(内含源码)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️数据结构与算法】 学习名言&#xff1a;天子重英豪&#xff0c;文章教儿曹。万般皆下品&#xff0c;惟有读书高——《神童诗劝学》 系列文章目录 第一章 ❤️ 学前知识 第二章 ❤️ 单向链表 第三章…

分布式一致性Hash算法原理及实现

文章目录 一致性Hash原理提高容错性和和扩展性一致性Hash实现思路代码 一致性Hash原理 简单来说&#xff0c;一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环&#xff0c; 如假设某哈希函数 H 的值空间为 0 ~ 2^32-1&#xff08;即哈希值是一个32位无符号整形&#xff09;…

搜狗百科怎么创建?搜狗百科创建指南(经验分享)

搜狗百科是一个允许用户创建、编辑和维护百科全书的网站。它是搜狗搜索旗下的一个产品&#xff0c;为用户提供了一个共享知识的平台。创建一个搜狗百科词条并非难事&#xff0c;但需要遵守一些注意事项。 话不多说。小媒同学将介绍搜狗百科词条的创建过程和注意事项。 一、创建…

java基础入门-04-【集合学生管理系统】

Java基础入门-04-【集合&学生管理系统】 11、集合&学生管理系统11.1.ArrayList集合和数组的优势对比&#xff1a;11.1.1 ArrayList类概述11.1.2 ArrayList类常用方法11.1.2.1 构造方法11.1.2.2 成员方法11.1.2.3 示例代码 11.1.3 ArrayList存储字符串并遍历11.1.3.1 案…

【观察】甲骨文以“双引擎”驱动,加速中国企业拥抱决策智能

毫无疑问&#xff0c;当前中国整体经济形态正在从传统经济向数字经济转型&#xff0c;千行百业也在加速数字化转型&#xff0c;特别是随着企业数据的沉淀越来越庞大&#xff0c;对数据平台以及智能决策等新技术的需求也越来越旺盛。 国家发布的《“十四五”数字经济发展规划》中…

视频里的音乐怎么转换成mp3格式?

视频里的音乐怎么转换成mp3格式&#xff1f;视频里的音乐转换为mp3的原因有很多&#xff0c;主要是因为mp3格式是一种音频格式&#xff0c;文件大小较小&#xff0c;更易于存储和传输。相比之下&#xff0c;视频格式则是一种视频文件格式&#xff0c;虽然包含音频&#xff0c;但…

Q-in-Q 和 MAC-in-MAC

例题引入&#xff1a; 1. 城域以太网在各个用户以太网之间建立多点第二层连接&#xff0c;IEEE802.1ad定义运营商网桥协议提供的基本技术是在以太网帧中插入&#xff08;26&#xff09;字段&#xff0c;这种技术被称为&#xff08;27&#xff09;技术。 (26)A.运营商VLAN标记…

Hive知识点的回顾

一、Hive的序列化和反序列化 Hive读取文件机制&#xff1a;读取文件中的每一行 > 反序列化 > 通过分隔符进行切割&#xff0c;返回数据表中的每一行对象。 Hive写文件机制&#xff1a;把数据表中的每一行Row对象 > 调用LazySimpleSerde类中的序列化方法 > 把Row对象…

基于AT89C51单片机的电子秒表设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87759735?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 设计一个电子钟,实现对时、分、秒的显示的控制,电路采用24小时计时方式。另一个功能是秒表功能…

JVM内存模型和结构介绍

什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一个虚构出来的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等。 为什么需要JVM&#xff1f; Java语言使用Java虚拟机屏蔽了与具体平台相关的信息&…

执行网格中有特定数量节点的传感器网络部署(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​无线传感器网络是通过大量分布的传感器节点作为终端来协同感知和自主地监测外部世界,以多跳、自组织或协作的方式进行通信和…

Java 基础进阶篇(十二)—— Arrays 与 Collections 工具类

文章目录 一、Arrays工具类1.1 Arrays 类常用方法1.2 对于 Comparator 比较器的支持1.3 Arrays 的综合应用1.3.1 应用一&#xff1a;数组的降序排序1.3.2 应用二&#xff1a;根据学生年龄进行排序 二、Collections工具类2.1 Collections 类常用方法2.2 Collections 排序相关 AP…