【问题标题】:code analysis to identify all changes between two commits which inflence a particular line of code or variable代码分析以识别影响特定代码行或变量的两次提交之间的所有更改
【发布时间】:2021-03-28 15:23:01
【问题描述】:

我有两个版本的源代码,其中包含一长串(大约 500 条)代码更改(遗憾的是没有可用的代码历史记录)。我想分割出任何对特定变量 XYZ 产生影响或可能产生影响的变化。最终目标是能够运行代码的结果并将其与所有代码更新进行比较,其中部分更新不影响 XYZ,并且没有任何更新。

有没有一种方法可以运行,例如,一种代码分析来识别哪些代码行会影响特定变量或代码行,然后自动分割出这些更改并创建补丁?我想在我目前拥有的两个版本之间进行一种中间提交。

代码是用C编写的, 我正在使用 git 来跟踪我自己的历史, 代码在 Visual Studio 2019 中编译。

【问题讨论】:

  • 假设您的代码有版本 A(旧)和版本 B(新)。在版本 B 中搜索不在 A 中的变量 xyz 的每一个出现并使用它,这不是解决这个问题的直接方法,“愚蠢”的方法吗?
  • @josepchappa,不仅仅是变量本身,它的所有函数和相关变量都会影响其值。
  • 这个过程的第一步是一样的,不是吗?这是为了识别所有出现的变量 xyz。然后确定使用哪种操作变量 xyz 并针对每种情况进行处理。比如说你有int xyz = 5,然后在代码的某个地方你有xyz = someFunc(),在其他地方你有int somevar = xyz + 123。如果某些函数和相关变量可以影响 xyz,那么它肯定会在代码中的某处被调用。直接访问或作为函数参数间接访问或用于其他一些操作。无论哪种方式,您都需要通过其名称调用 xyz。

标签: c git analysis code-analysis


【解决方案1】:

我不知道有什么软件可以做到这一点,因为在大多数编程语言中,它是不平凡的。例如,如果您在函数f 中获取指向该变量的指针,那么f 直接或间接调用的任何函数都可能受到该变量的影响并且可能会修改它(即使以不严格的方式定义的行为)。这是因为这些函数中的任何一个都可以接受指针(可能转换为另一种类型或整数)。同样,如果该函数采用指针值或返回非 void,则任何调用者都可以修改该值(同样,通过各种强制转换)。

如果您将自己限制在 C 标准明确定义的东西上,那么范围会小一些,但是许多非平凡的程序会表现出一些未定义的行为,这样的工具对于任何类型的系统编程都是完全不可用的。在那种情况下,这仍然是相当困难的。

这在像 Rust 这样的语言中可能会稍微容易一些,它对可变性和引用有严格的限制,但即使在那里,我怀疑你的问题在一般情况下很可能归结为解决停止问题或至少极难解决。当然,您的具体代码可能要简单得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2012-12-14
    • 2014-03-09
    • 2011-03-09
    相关资源
    最近更新 更多