当前位置: 首页 > news >正文

带你走进Cflow (三)·控制符号类型分析

目录

​编辑

1、控制符号类型

1.1  语法类

1.2  符号别名

1.3  GCC 初始化


1、控制符号类型

        有人也许注意到了输出中奇怪的现象:函数_exit 丢失了,虽然它在源文件中被printdir 调用了两次。这是因为默认情况下 cflow 忽略所有的一下划线开头的符号。为了将这样的符号包含进来,我们使用-i _ (or --include _)命令行选项。继续我们的例子:

$ cflow --number -i _ d.c1 main() <int main (int argc,char **argv) at d.c:85>:2 fprintf()3 atoi()4 printdir() <void printdir (int level,char *name) at d.c:42> (R):5 getcwd()6 perror()7 _exit()8 chdir()9 opendir()10 readdir()11 printf()12 ignorent() <int ignorent (char *name) at d.c:28>:13 strcmp()14 isdir() <int isdir (char *name) at d.c:12>:15 stat()16 perror()17 S_ISDIR()18 putchar()19 printdir()<void printdir (int level,char *name) at d.c:42>(recursive: see 4)20 closedir()

        通常情况下,参数--include 制定了一个符号类列表。默认的选项行为是输出中包含被请求的类。如果参数是以减号或插入符号开始的,则处理方式正好相反,是在输出结果中排除这种符号类。

        符号类‘_’包含了所有已下划线开头的符号。另一个有用的符号类是’s’,它表示静态函数或数据。默认情况下,静态函数是被包含在输出中的。为了省略他们,可以使用所给的-i ^s (or -i -s)选项。我们的样例程序 d.c 中定义了静态函数 isdir,运行 cflow -i ^s,可以在结果图中完全忽略这个函数和它的调用者。

$ cflow --number -i ^s d.c1 main() <int main (int argc,char **argv) at d.c:85>:2 fprintf()3 atoi()4 printdir() <void printdir (int level,char *name) at d.c:42> (R):5 getcwd()6 perror()7 chdir()8 opendir()9 readdir()10 printf()11 ignorent() <int ignorent (char *name) at d.c:28>:12 strcmp()13 putchar()14 printdir()<void printdir (int level,char *name) at d.c:42>(recursive: see 4)15 closedir()

        实际上,非包含符号(‘^’ 或 ‘-’)可以在-i 的参数中的任何地方使用,不仅限于开始。因此,选项-i _^s 表示包含除了静态函数以外的以下划线开头的符号。-i 选项可以累积使用,所以这个例子可以写为-i _ -i ^s。

        一个很重要的一点是,默认情况下 cflo 图中只包含函数。然而你可以使用符号类“x”来将变量输出。这个类包含所有的数据符号,包括全局变量和静态变量。如下例:

$ cflow --number -i x d.c1 main() <int main (int argc,char **argv) at d.c:85>:2 fprintf()3 stderr4 max_level <int max_level at d.c:37>5 atoi()6 printdir() <void printdir (int level,char *name) at d.c:42> (R):7 DIR8 dir9 getcwd()10 perror()11 chdir()12 opendir()13 readdir()14 printf()15 ignorent() <int ignorent (char *name) at d.c:28>:16 ignored_names <char *ignored_names[] at d.c:24>17 strcmp()18 isdir() <int isdir (char *name) at d.c:12>:19 stat()20 perror()21 S_ISDIR()22 NULL23 max_level <int max_level at d.c:37>24 putchar()25 printdir()<void printdir (int level,char *name) at d.c:42>(recursive: see 6)26 closedir()

        现在,第 3、4、16、23 行显示了数据标号,同时显示了可用的定义。然而请注意第 7、8 行。为什么类型名 DIR 和自动变量 dir 也被作为数据列出?为了回答这个问题,我们首先描述一线 cflow 对符号的概念定义。程序维持着符号表,使用 C 语言预处理关键字初始化。当解析输入文件时,cflow 更新了这些表。特别的,当遇到一个 typedef 时,它就将这个定义符号注册为数据类型。现在,DIR 在 d.c 中没有声明,所以 cflow 无法知道这是一个数据类型。所以他认为这是一个变量,这样一来输入:DIR *dir;就被解析为一个表达式,意思是“DIR乘以 dir”。

        当然这是错误的。有两种方式可以帮助 cflow 排除这种混淆。要么详细的声明 DIR为一个数据类型,要么让 cflow 运行预处理器,这样一来 cflow 就能看到头文件的内容,并自己做出决定。运行预处理器在下一章中。这一章我们主要集中精力在第一种方法。

        命令行选项--symbol (-s)声明这个符号的语法类。这个参数包含了被冒号隔开的两个字符串:--symbol sym:class。

        第一个字符串,sym 是 C 语言的符号表的识别码。第二个字符串,class,指定了与这个符号结合的类。特别的如果 class 是‘type’,那么符号 sym 就被记录为 C 语言类型定义。因此,修改上面的输出,运行:

$ cflow --number -i x --symbol DIR:type d.c

        另一个重要的符号类型是参数包装,这是宏的一种,经常用于兼容 ANSI 之前的编 译 器 来 保 护 函 数 原 型 中 的 参 数 声 明 的 源 。 比 如 下 面 的 声 明 , 从/usr/include/resolv.h 中获得,其中__P 是参数包装:

void res_npquery __P((const res_state, const u_char *, int, FILE *));

        为了能让 cflow 处理这样的声明,声明__P 为一个包装,例如:

cflow --symbol __P:wrapper *.c

        在所有的必须使用--symbol 选项的例子中,都是 cflow 不能识别给定的符号的意义,这要么是因为 cflow 不能看到类型的定义,就像‘DIR’的例子;要么是因为宏定义没有展开。这两种情况都可以用下一章藐视的预处理模式来解决。虽然有了预处理模式,但--symbol 选项还是有用的,我们会在下面的一节中看到:

1.1  语法类

总的来说,符号定义的语法类在 C 语言代码中是可以合法存在的。有如下的类:

关键字;关键字,比如‘if’、‘when’等

修改器;类型修改器,比如这个符号在数据类型后出现,可以修改数据的意义,比如指针‘*’。

修饰符;声明修饰符。能在 C 数据类型的前面和后面声明。你也许会经常声明gcc 关键字‘__extension__’作为修饰符:--symbol __extension__:qualifier

识别码;C 语言识别码。

类型;C 语言数据类型,比如‘char’,’int’。

包装器;他有两个用途,第一个是当没有运行预处理的时候声明一个参数包装器。这种用法在前面已经声明了。第二种,他表示任何能出现在声明符前或作为结尾的分号之前和后面可以跟一个括号表达式列表中的任何符号。

我们建议这样对 gcc 使用这个类:‘__attribute__’。

1.2  符号别名

        另一个--symbol 选项的用法是定义符号别名。别名是一个与被它引用的符号完全一样的标识。别名可以这样声明:--symbol newsym:=oldsym这样一来,符号 newsym 就被声明为和 oldsym 完全一样的类型了。

        符号别名也能在其他例子中作为定义符号类使用。对一些特殊的关键字是非常有用的,例如‘__restrict’: --symbol __restrict:=restrict。

1.3  GCC 初始化

下面的引用集是使用 gcc 时 cflow 的初始化选项。我们建议将他们放到 cflow.rc文件中:

--symbol __inline:=inline--symbol __inline__:=inline--symbol __const__:=const--symbol __const:=const--symbol __restrict:=restrict--symbol __extension__:qualifier--symbol __attribute__:wrapper--symbol __asm__:wrapper--symbol __nonnull:wrapper--symbol __wur:wrapper

带你走进Cflow (一)-CSDN博客

带你走进Cflow (二)·输出格式和递归调用-CSDN博客

相关文章:

带你走进Cflow (三)·控制符号类型分析

目录 ​编辑 1、控制符号类型 1.1 语法类 1.2 符号别名 1.3 GCC 初始化 1、控制符号类型 有人也许注意到了输出中奇怪的现象&#xff1a;函数_exit 丢失了&#xff0c;虽然它在源文件中被printdir 调用了两次。这是因为默认情况下 cflow 忽略所有的一下划线开头的符号…...

FPGA UDP RGMII 千兆以太网(3)ODDR

1 xilinx原语 在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、ODDR、IDELAYE2、ODELAYE2(A7 中没有)、IDELAYCTRL。其中,IDDR和ODDR分别是输入和输出的双边沿寄存器,位于IOB中。IDELAYE2和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时,IDELAYE2 …...

OSG交互:选中场景模型并高亮显示

1、目的 可以在osg视图中选中指定模型实体,并高亮显示。共分为两种,一种鼠标点选,一种框选。 2、鼠标点选 2.1 功能说明 生成两组对象,一组cow对象可以被选中,另一组robot不能被选中;点击cow对象被选中高亮,点击robot被选中不高亮;点击空白处,弹出“select nothing!…...

农业大棚智能化改造升级与远程视频监管方案,助力智慧农业建设发展

一、需求分析 随着现代化技术的发展&#xff0c;农业大棚的智慧化也成为当前备受关注的智慧农业发展手段。利用先进的信息化手段来对农业大棚进行管理&#xff0c;采集和掌握作物的生长状况、作业监督、生态环境等信息数据&#xff0c;实现精准操作、精细管理&#xff0c;远程…...

P6入门:项目初始化2-项目详情之日期Date

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…...

【ubuntu20.04】win10安装ubuntu20.04双系统

win10安装ubuntu20.04双系统&#xff1a; 【ubuntu20.04】win10安装ubuntu20.04双系统:https://www.bilibili.com/video/BV11k4y1k7Li/?spm_id_from333.999.0.0&vd_source66a67b8a0b3c4e03915bf8b3a6ff9a74 ubuntu与windows双系统时间同步&#xff1a; windows认为&…...

使用ffmpeg 压缩视频

我有一批1080p的视频,在网上播放占用空间太大,需要进行压缩以后再上传,下面是记录一下ffmpeg命令的使用情况 原视频大小:288mb --压缩加修改分辨率 640p ffmpeg -y -i C4995.mp4 -vcodec libx264 -crf 18 -s vga C4995\C4995_2.MP4 -y: 强制覆盖 -i :输入文件 -vcodec lib…...

C# , .netWebApi, WPF 用特性实现类似Java 的Ioc 自动装配@Autowired

写C# 一直很羡慕Java的@Autowired 自动装配. 因为C# 必须手动在Ioc里注册 之前用接口实现了自动注册IOC, 总是觉得美中不足, 毕竟没有真正实现用注解/特性实现自动注入, 这次我们来实现一个用特性注入Ioc的扩展方法. namespace MyCode.BLL.Service.Ioc {/// <summary>/…...

3DMAX汽车绑定动画模拟插件MadCar疯狂汽车使用教程

3DMAX汽车绑定动画模拟插件MadCar疯狂的汽车&#xff0c;用于通过模拟控制来快速装配轮式车辆及其动画。这个新版本允许装配任何数量的车轮的车辆&#xff0c;以及包括摩托车在内的任何相互布置。还支持任意数量的拖车。 每个车轮和悬架都有简化的行为设置以及微调&#xff0c…...

比较PID控制和神经网络控制在机器人臂上的应用

机器人臂是自动化领域中常见的机器人形式&#xff0c;其精确控制对于实现复杂任务具有重要意义。在机器人臂的控制中&#xff0c;PID控制和神经网络控制是两种常用的控制方法。本文将比较PID控制和神经网络控制在机器人臂控制方面的应用&#xff0c;包括控制原理、优缺点以及在…...

ubuntu16.04 交叉编译 mbedtls

在为客户交叉编译项目时需要依赖 mbedtls&#xff0c; 客户的机器是 arm64 的 ubuntu 16.04&#xff0c; 交叉编译过程中遇到几个问题。 首先&#xff0c; mbedtls 需要依赖 python, 在 cmake 的过程中&#xff0c; 如果不是使用系统默认的 cmake 可能会导致&#xff0c;mbedt…...

基于遗传算法优化的直流电机PID控制器设计

PID控制器是工业控制中常用的一种控制算法&#xff0c;通过不断调节比例、积分和微分部分来实现对系统的稳定控制。然而&#xff0c;在一些复杂系统中&#xff0c;传统的PID参数调节方法可能存在局限性。本文将介绍一种基于遗传算法优化的直流电机PID控制器设计方法&#xff0c…...

大数据-之LibrA数据库系统告警处理(ALM-12036 license文件即将过期)

告警解释 系统每天零点检查一次当前系统中的license文件&#xff0c;如果当前时间距离过期时间不足60天&#xff0c;则license文件即将过期&#xff0c;产生该告警。 当重新导入一个正常license&#xff0c;告警恢复。 说明&#xff1a; 如果当前集群使用节点数小于等于10节…...

关于Android Studio中开发Flutter配置

配置系统环境变量&#xff1a;path下 &#xff0c;flutter的bin目录下 File->Settings->Languages&Frameworks->FlutterFile->Settings->Languages&Frameworks->DartFile->Settings->Languages&Frameworks->Android SDK 确认是…...

大容量疯了!居然想把磁带放到硬盘,100TB+是否可以实现?

1.引言 上一篇关于大容量硬盘的文章&#xff08;HDD最后的冲刺&#xff1a;大容量硬盘的奋力一搏&#xff09;中&#xff0c;我们针对大容量硬盘研发状态&#xff0c;小编最近又有了新发现。WDC希望可以通过HDD和磁带结合&#xff0c;把盘的容量提升到100TB。 2.数据大爆炸的…...

C++之map的介绍

C之map的介绍 1。定义和初始化 map可以使用一对<key, value>来初始化&#xff0c;如下所示&#xff1a; std::map<int, std::string> my_map { {1, "one"}, {2, "two"}, {3, "three"} };这将创建一个map&#xff0c;其中键是整数&…...

非常好用的组件库【semi.design】

文章目录 前言semi.design是什么&#xff1f;怎么使用&#xff1f;设计稿转代码后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不…...

Semantic-Guided Zero-Shot Learning for Low-Light ImageVideo Enhancement

论文阅读之无监督低光照图像增强 Semantic-Guided Zero-Shot Learning for Low-Light Image/Video Enhancement 代码&#xff1a; https://github.com/ShenZheng2000/SemantiGuided-Low-Light-Image-Enhancement 在低光条件下增加亮度的一个可行方法是使用更高的ISO或更长时间…...

分享Python的十大库,这你一定得知道!

文章目录 前言关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python为我们提供了非常完善的基础库&#…...

react: hooks

useState useState的作用是是变量具有响应式&#xff0c;改变值页面可以同步变化 import { useState, useEffect } from "react";// 当前状态和一个让你更新它的函数 &#xff1b; 参数为状态初始值 const [initLoading, setInitLoading] useState(true);// 任意地…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...