展示 HN: RealDiff - 用于拉取请求的运行时行为差异比较(六种语言)
RealDiff 找出普通源码审查无法检测到的运行时行为变化。它构建两个 Git 修订版本,观察它们的测试,从三个基础运行中学习噪声基线,并报告每个调用树中的第一个改变行为。源码差异告诉你编辑了什么,而 RealDiff 告诉你编辑的结果,包括对未触及文件的影响。为什么使用它?看似无害的重构可能会更改远离编辑文件的行为: public static List<(int Priority, T Value)> ByPriority<T>( - 这个 IEnumerable<(int Priority, T Value)> src) - { - var list = src.ToList(); - list.Sort((a, b) => a.Priority.CompareTo(b.Priority)); - return list; - } + 这个 IEnumerable<(int Priority, T Value)> src) => + src.OrderBy(item => item.Priority).ToList(); List.Sort 不是稳定的; OrderBy 是。在包含的演示中,这一行基础设施更改影响了一台未编辑的定价引擎:RealDiff: 1 个行为差距超出了这个差异 DiscountEngine.SelectDiscount 返回 "CLEARANCE_40",现在返回 "SEASONAL_15"。 CheckoutTotals.Compute 返回 60,现在返回 85。执行此操作的 3 个测试中有 2 个没有对变更进行断言。编辑的助手在 Infrastructure.Collections 中;观察到的影响在 Commerce.Pricing 中。运行下面的演示,或检查维护的公共 .NET 演示拉取请求及其成功的托管运行。五分钟 .NET 演示 此 .NET 演示的前提条件:Git, .NET 8 SDK 和 PowerShell 7。Java 分析还需要 JDK 和存储库的 Maven/Gradle 包装器或对应的系统工具;Node 分析需要 Node.js 和其锁定文件选定的包管理器。 git clone https: // github.com / issacnitin / RealDiff.git cd RealDiff dotnet build RealDiff.sln - c Release pwsh -File tools / verify - diff.ps1 - Mutate - Change sort 证明创建一个临时提议更改树,仅更改 SortingExtensions.cs ,运行基线两次加一次更改,并写入 findings.json 。它验证:编辑的文件贡献了零个追踪成员;前沿是 Commerce.Pricing.DiscountEngine.SelectDiscount 在未编辑的项目中;两个调用站点发生了变化,但没有断言反应;五个分歧键合并为三个前沿节点;相同优先级选择在新进程中是确定性的。运行所有维护的演示模式:pwsh -File tools / verify - demo - fixtures.ps1 这涵盖了排序稳定性、重试策略和配置解析。公共可执行文件是一个轻量级的 Rust 启动器,负责参数路由、存储库配置加载和检测。它启动一个独立的受管理组件,以进行引用解析、构建、缓存、仪器和发布。体系结构随后有一个语言无关的追踪契约,每个运行时一个追踪器,以及一个单遍流式 Rust 差异、前沿和发现引擎:flowchart LR L[Rust argv, config, detect] --> O[Managed orchestration] O --> D O --> J O --> N O --> G O --> R O --> P D[.NET / Cecil] --> T[realdiff.trace/1] J[Java / javaagent + ASM] --> T N[Node / CJS + ESM + Babel] --> T G[Go / stable AST rewrite] --> T R[Rust / stable syn rewrite cache] --> T P[Python / PEP 669 sys.monitoring] --> T T --> E[Rust matching, noise, frontier, and findings] E --> F[findings.json] F --> P[GitHub, Azure DevOps, MCP] 加载 TRACE-FORMAT.md 是追踪器与引擎之间的契约。维护的 .NET、Java、Node、Go、Rust 和 Python 网关应用相同的符合规则:相同的方法集、每个键的事件计数和入口序号、源触发器、摘要证明,以及来自非空运行的零引擎分歧。状态:早期预览。统一 CLI 从常规根标记中检测 .NET、Maven/Gradle Java、npm/pnpm/Yarn/Bun Node、Go 模块、Cargo Rust 和 Python 3.12+ 存储库。支持的语言 语言 instrumentation 测试/源集成 当前限制 .NET 8 Mono.Cecil 在编译时进行 IL 编织 xUnit 和可移植 PDB 属性、事件和运算符被政策排除。类型初始化器在结构上是不可观察的,因为钩子在 CLR 类型初始化锁下运行,可能导致启动死锁。 Java java.lang.instrument agent 与 ASM Maven/Gradle, JUnit/TestNG 注释,推断或配置的源根 Gradle 源集推断覆盖字面 srcDir / srcDirs 声明;动态源集配置需要 source_roots 。集合形状规则要求对 java.util 模块访问。类初始化器在结构上是不可观察的,因为钩子在 JVM 类初始化锁下运行,可能导致启动死锁。 Node / TypeScript CommonJS 要求钩子和 ESM 加载器与 Babel npm、pnpm、Yarn Classic/Berry、Bun、直接 JavaScript 位置、TypeScript 源映射、Jest/Vitest 适配器 精确需要一个所支持的锁定文件;工作进程超出范围;生成器和不受支持的可调用项被跳过。 Go 稳定的模块感知 AST 重写到构建缓存 go test,原始 .go 分析仪位置 动态接口/函数边界和未重写
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡