Software reuse has emerged as one of the most crucial elements of modern software development. The standard way to study the dependency networks caused by reuse is to infer relationships between software packages through manifests in the packages' repositories. Such networks can help answer important questions like "How many packages have dependencies to packages with known security issues?" or "What are the most used packages?". However, an important overlooked aspect of current networks is that manifest-inferred relationships do not necessarily describe how or whether these dependencies are actually used in the code. To better model dependencies between packages, we devise Pr\"azi, an approach combining manifests and call graphs of packages. Pr\"azi constructs a fine-grained dependency network at the more fine-grained function-level, instead of at the manifest-level. For this paper, we provide a prototypical Pr\"azi implementation for the popular system programming language Rust. Using it, we replicate a recent evolution study characterizing Rust's package repository, Crates.io, on the function-level. Our results identify new key characteristics and developments of Crates.io: i) 49% of all function calls in Crates.io target a function in a dependency, suggesting prevalent reuse of dependencies, ii) packages call 40% of their resolved transitive dependencies, iii) package maintainers make nearly 7 new calls to their dependencies biannually, and iv) packages have two to three times more indirect callers than direct callers of their APIs. These results show that current analyses of manifest-level dependency networks are not sufficient to understand how packages use each other.
翻译:软件的再利用已成为现代软件开发的最关键元素之一。 研究再利用产生的依赖网络的标准方法是通过软件包库的显示器来推断软件包之间的关系。 这种网络可以帮助回答重要问题, 比如“ 有多少软件包依赖已知安全问题的包装? ” 或“ 哪些是使用最多的包? ” 。 然而, 当前网络中一个被忽略的重要方面是, 显而易见的关系不一定描述这些依赖关系在代码中如何或是否实际使用。 为了更好地说明软件包之间的依赖关系, 我们设计了Pr\"azi, 一种将软件包的表和调用图组合图组合图结合起来的方法。 Pr\“azi”在更精细的功能层面构建了一个精细的依赖网络网络。 对于本文,我们为流行的系统编程语言提供了一种半典型的 Pr\\\ 执行方式。 使用它, 我们复制了最近关于 Rust 的软件包储存员的包装库储存库的进化研究, Crates.io, 在功能层面, 我们发现两个新的关键特性和软件包的开发过程, 而不是直接再利用它们的连续的版本。 (i) 四十九) 功能显示一个固定的自动的功能。 (i) 四十九) 显示一个固定的固定的固定的自动的功能。