自动标记 C 中未使用的结构成员

2023-12-03

我需要一个工具来自动标记未使用的结构成员在 C 代码库中。我对“未使用”的定义很简单 - 如果从代码中删除结构成员定义,并且代码编译成功,则该结构成员被声明为未使用。问题是 - 如何以自动化方式完成此操作? (由于代码库很小,速度并不是太重要)。

关于该主题的现有堆栈溢出文章似乎暗示目前还没有现有的静态分析工具可以做到这一点。另一方面,考虑到 Clang 的模块化,我认为这应该可以通过 AST 操作来实现。我们以单个文件为例。我想做的是以下(这可以稍后推广到代码库中的一组源文件):

  1. 从 C 代码生成 AST。
  2. Recursively visit all structure field defintions and remove them one-by-one. We can keep a "seen" dictionary to ensure we don't remove already seen field definition nodes.
    • 过滤出字段定义,仅保留要分析的代码库中存在的字段定义(例如,避免标准库中的定义)。
  3. 编译代码。
  4. 如果代码编译成功,则相应的字段声明未使用并被标记。
  5. 继续#1。

上面的关键字是remove。我怎么能够remove字段定义?使用 Clang 似乎有两种方法。

  1. 在源代码级别,我们可以使用 Clang Rewriter 删除字段声明(有一个“RemoveText(SourceRange)”选项)。但是,我不知道这是否会一直有效(例如:结构是使用宏扩展自动生成的)。
  2. 从 AST 中删除字段声明节点,然后“重新编译”AST(无论这意味着什么)。

在上述两个选项中,#1 似乎很 hacky - 您需要创建源文件的副本,在删除字段定义后重新编写它,然后重新编译修改后的源文件。而且,我不确定当涉及生成结构字段定义的复杂宏时它的工作效果如何。

#2 看起来很干净,但从谷歌搜索来看,似乎没有“删除 AST 节点”这样的东西(它是不可变的)。如果我错了,请纠正我。即使我成功了,我如何从现在开始重新评估 AST 是否缺少对结构字段的引用? (“编译”步骤)。

任何建议表示赞赏(提前致谢!)。我已经通过上面的#1 方法取得了一些初步的成功,但我觉得这不是正确的方向。


cppcheck可以做到这一点。例如:

// test.cpp
struct Struct
{
    int used;
    int unused;
};

int main()
{
    Struct s;
    s.used = 0;
    return s.used;
}
$ cppcheck test.cpp --enable=all
Checking test.cpp ...
test.cpp:5:9: style: struct member 'Struct::unused' is never used. [unusedStructMember]
    int unused;
        ^

虽然我在示例中使用了 C++ 代码,但它的行为与 C 相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动标记 C 中未使用的结构成员 的相关文章

随机推荐

  • 给定日期时间的年龄(以年为单位,具有小数精度)

    如何在 C 日期时间中获取给出出生日期的人的年龄 我想要一个精确的年龄 比如 40 69 岁 这将计算出准确的年龄 年龄的小数部分是相对于上一个生日和下一个生日之间的天数来计算的 因此它将正确处理闰年 小数部分在一年中是线性的 并且不考虑月
  • 如何在实体框架中为不同用户使用不同的连接字符串

    我有一个要求 我需要为不同的用户提供不同的连接字符串 我们的想法是拥有username and password在登录屏幕上提供 用作username and password连接字符串的 从而使应用程序为不同的用户使用不同的连接字符串 并
  • sqlite3 c/c++,获取聚合查询涉及的表名

    我在 C 项目中使用 sqlite 我希望能够获取查询中涉及的表名 Ex SELECT FROM Employee 应该返回Employee 现在我使用成功了qlite3 column table name doc 对于此类查询 但对于聚合
  • VB.NET 中令人困惑的逻辑运算符

    我正在使用用 VB 编写的遗留代码库 并且遇到了一个我不理解的条件运算符 并且无法弄清楚要搜索什么来解决它 我正在处理的是以下代码和结果为 true 的变量 我不明白的具体部分是 1 第一个之间的关系X和第一个括号 2 2 的作用X lt
  • jq:传递不带引号的字符串参数

    我想传递一个不带引号的参数 JQ arg 默认情况下有双引号 因为它应该用作过滤器 例如 propt properties final jq r c arg p propt p sample json echo final 样本 json
  • Scala 柯里化与部分应用函数

    我意识到这里有几个问题what柯里化和部分应用函数是 但我问的是它们有何不同 作为一个简单的例子 下面是一个用于查找偶数的柯里化函数 def filter xs List Int p Int gt Boolean List Int if x
  • AS3 - 如何使用鼠标事件的像素/点检测而不是对象检测

    这看起来应该很容易 我都不好意思问 但我就是不明白 我有一个大的圆形 MovieClip 用作按钮 该影片剪辑包含具有透明背景的PNG插入到影片剪辑中 由于其尺寸 四个角 边界框 上有较大的空白注册区域 如何让鼠标注册为仅位于圆形像素上方
  • 我需要在 ASP.Net core Web API 的验证属性中返回自定义的验证结果(响应)

    我需要在 ASP Net core Web API 中返回自定义的验证结果 响应 失效属性 这是我创建的 ValidationAttribute class MaxResultsAttribute ValidationAttribute p
  • 如何单独更改按钮 pygame 上文本的不透明度?

    我下面有以下代码 它是从另一篇文章中获取的按钮的类 我想知道是否可以更改按钮背景的不透明度而不更改其上文本的不透明度 我怎样才能实现这个目标 Code import pygame pygame init font pygame font S
  • 如何读取 zip 存档中的单个文件

    我需要读取 zip 文件内的单个文件 test txt 的内容 整个 zip 文件是一个非常大的文件 2GB 并且包含很多文件 10 000 000 因此提取整个文件对我来说不是一个可行的解决方案 如何读取单个文件 尝试使用zip wrap
  • 使用 css 在 上设置强制宽度,该宽度位于 下,使用 colspan 而不使用 colgroup

    我想设置宽度td in tbody在下面thead th有一个colspan 2 具有硬定义的列宽 以 为单位 如果单元格内容超出 浏览器外壳不会动态调整表格宽度 sample width 100 table layout fixed sa
  • 如何在 CakePHP 2.0 中发送带有附件的电子邮件?

    我正在尝试使用 CakePHP 2 0 发送一封带有附件的电子邮件 该文件由用户通过表单提交 到目前为止我有 App uses CakeEmail Network Email email new CakeEmail email gt att
  • 使用 handler.postDelayed 获取剩余时间

    我在用handler postDelayed为某些动画内容创建一些延迟的方法 像这样 Handler h new Handler h postDelayed new Runnable Override public void run Sta
  • 如何在 foreach 循环中删除 xmlnode?

    在下面的代码中 我使用 foreach 循环来检查节点列表中的每个节点并删除其中的一些节点 删除一个节点后 foreach 循环抛出以下错误 元素列表已更改 枚举操作无法继续 我怎样才能避免它 public static XmlNodeLi
  • 在C中使用紧凑指针寻址二维数组的元素[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在使用 C 实现莫尔斯电码并遇到一些基础知识 基本思想是我有 A 到 Z 的二维字符数组 每个数组的第一个元素是一个字母表 后跟相应的莫尔斯电码 程序将接收一个字符 一旦找到匹配项 该
  • Hadoop 类型与映射预期值中的键不匹配文本收到的值 LongWritable

    有人知道为什么我会收到此错误吗 我看过很多其他类似的帖子 但其中大多数不适用于我 我也尝试了发布的一些确实适用于我的解决方案 但它们不起作用 我确信我只是错过了一些愚蠢的东西 谢谢您的帮助 chris chrisUHadoop usr lo
  • 将按类别分类的行添加到我的数据框中

    我使用 groupby 创建了一个新的聚合数据框 但在每个类别下添加小计行时遇到问题 我尝试过使用 pd groupby 和数据透视表并更改索引 但我无法按照我想要的方式表示数据 为每个 客户 创建 USD Balance 小计 但将其添加
  • 如何使可调用的谷歌云函数幂等

    我有一个谷歌云功能 可以向 firebase 主题发送通知 该功能一直工作正常 直到突然 它开始同时发送多个通知 2 或 3 联系 Firebase 支持团队后 他们告诉我我应该使函数幂等 但我不知道如何 因为它是一个可调用函数 更多细节
  • 将新的 APNS 证书上传到 GCM

    我们有一个使用 GCM 的 iOS 和 Android 应用程序 我正在尝试将新的生产 APNS 证书上传到 GCM 但无法上传 因为 Google 正在将 GCM 迁移到 Firebase 我怎么做 这是 Google 开发者产品的屏幕截
  • 自动标记 C 中未使用的结构成员

    我需要一个工具来自动标记未使用的结构成员在 C 代码库中 我对 未使用 的定义很简单 如果从代码中删除结构成员定义 并且代码编译成功 则该结构成员被声明为未使用 问题是 如何以自动化方式完成此操作 由于代码库很小 速度并不是太重要 关于该主