流程度是分析RUST程序信息流的工具。 Flowistry了解一件代码是否可能影响另一个代码。 Flowistry集成到IDE中,以提供“焦点模式”,可帮助您专注于与当前任务相关的代码。
例如,此GIF显示读取工会两个设置的函数时的焦点模式:

当用户单击给定的变量或表达式时,流式逐渐淡出所有不影响该代码的代码,并且不受该代码影响。例如, orig_len不受for-loop的影响,而set.len()为。
当您阅读带有大量代码的函数时,流程度可能会有所帮助。例如,此GIF在Rust编译器中显示了一个实际功能。如果您想了解特定参数对该函数的作用,那么流式可以将大部分代码滤除为无关紧要:

Powers Flowistry的算法发表在PLDI 2022年的“模块化信息流”的论文中。
目录
流程度可作为VSCODE插件可用。您可以从Visual Studio Marketplace或Open VSX注册表中安装流程度。在vscode中:
关于平台支持的注释:流动部尚未支持Nixos。 Flowistry不能为M1 MAC等ARM目标提供预构建的二进制文件,因此必须在这些目标上从头开始安装Flowistrist(这是为您完成的,但要比通常需要多几分钟)。
另外,您可以从源安装它:
# Install flowistry binaries
git clone https://github.com/willcrichton/flowistry
cd flowistry
cargo install --path crates/flowistry_ide
# Install vscode extension
cd ide
npm install
npm run build
ln -s $(pwd) ~/.vscode/extensions/flowistry
如果您对基础分析感兴趣,则可以使用发布到板条箱的flowistry板板条:https://crates.io/crates/flowistry
该文档在此处发布:https://willcrichton.net/flowistristy/flowistrist/
注意:docs.rs不支持使用
#![feature(rustc_private)],因此我们必须自己托管它。
请注意,最新流动膜具有Rust 1.73的最大支持Rust版本。不能保证流量为1.73之后实现的功能。
安装流程度后,请在VSCODE中打开Rust Workspace。您应该在底部工具栏中看到此图标:

Flowistry通过字体检查您的代码库开始。如果您有很多依赖关系,这可能需要几分钟。
注意:流动类型检查结果被缓存在
target/flowistry目录中。如果删除此文件夹,Flowistry将不得不重新计算类型。同样,对于大型代码库,该目录可能会占用相当数量的磁盘空间。
流动式启动后,加载图标将消失。然后,您可以通过运行“切换焦点模式”命令进入焦点模式。默认情况下,键盘快捷键是ctrl+r ctrl+a(Mac上的⌘+r⌘+a),或者您可以使用“流”上下文菜单:

在焦点模式下,一旦将光标放到此处,Flowistry将自动计算给定函数中的信息流。一旦流动术完成分析,状态栏将看起来像这样:

注意:对于较大功能,流动膜可能有点慢。完成分析可能需要长达15秒。
流动术会根据光标侵入您要关注的内容。因此,如果单击变量,则应看到该变量的焦点区域。 Flowistry将以灰色突出显示重点代码,然后在焦点区域之外淡出代码。例如,由于用户的光标正在view_projection上,因此该变量以灰色突出显示,并显示其焦点区域。

有时,您想将焦点区域保持在原处,然后单击其他代码以对其进行检查而不会改变焦点。为此,流动术具有“标记”的概念。选择重点关注的代码后,您可以运行“ SET MARK”命令(CTRL+R CTRL+S /⌘+R+S)。然后在光标的当前位置设置一个标记,焦点将留在那里,直到您运行“ Unsot Mark”命令(CTRL+R CTRL+D /⌘+R⌘+D)。
如果要修改焦点区域中的所有代码,例如要将其评论或复制它,则可以运行“选择重点区域”命令(CTRL+R CTRL+T /⌘+R+T)。这将使整个焦点区域添加到编辑的选择中。
Flowistry是一个积极的研究项目,用于RUST的信息流分析的应用。当我们尝试分析技术和相互作用范例时,它正在不断发展。因此,它不像Rust Analyzer这样的工具那么抛光或高效,但是我们希望您仍然可以发现它有用!然而,当使用流动技术以避免感到惊讶时,您应该了解许多重要的局限性。
如果您有疑问或问题,请提交GitHub问题,加入我们的Discord或Twitter上的DM @wcrichton。
当您的代码有参考时,流动层需要了解该参考点的点。 Flowistry使用Rust的寿命信息来确定点对点信息。但是,使用内部突变性(例如Arc<Mutex<T>>明确的数据结构不会在同一数据之间共享寿命。例如,在此片段中:
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ;流式可以确定*x.lock().unwrap() = 1是x的突变,但不能确定它是y的突变。因此,如果您专注于y ,即使它与y的价值相关,对1的作业也会消失。
我们正在研究克服这一限制的方法,但是现在,请注意,这是众所周知,流动性提供不正确的答案的主要情况。
Flowistry的分析试图包括所有可能影响焦点的代码。由于实际和基本原因,该分析为许多假设做出了许多假设。例如,在此片段中:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ;如果您专注于第3行上的v ,则将包括v.get_mut(0)作为可以修改v操作。原因是流动技术实际上并未根据其类型签名分析所谓功能的身体,而是基于其类型的签名。因为get_mut将&mut self输入,因此假设可以修改向量。
通常,您应该将焦点模式用作修剪工具。如果代码褪色,则不必阅读它(减去上面提到的限制!)。如果没有褪色,则可能与您的任务有关。
Flowistry通过使用Rust Compiler的API分析给定函数的miR图来起作用。然后,IDE扩展将分析从miR级别恢复到源水平。但是,从源代码到MIR的旅程中,有关该程序的许多信息都会丢失。
例如,如果源包含expression foo.whomp.bar().baz() ,则可能仅对expression foo.whomp.bar()生成临时变量。因此,如果用户选择foo ,则流式措施可能无法确定这对应于代表foo的mir位置。
这就是为什么IDE扩展突出显示了灰色的重点代码的原因,因此您可以了解光标的选择实际映射。
Flowistry一次分析单个函数。如果一个函数包含其他功能,例如fn定义或闭合或通过异步隐式函数,则流式将仅显示包含光标最小函数主体内的焦点区域。对于功能定义和关闭,这通常是很好的定义,但是对于异步而言可能会造成混淆,因为这取决于Rustc如何决定雕刻您的异步功能。
如果Rusup失败,尤其是在诸如“无法重命名下载的文件”之类的错误中,这可能是因为Flowistrister与另一个工具(例如Rust-Analyzer)同时运行Rusup。在解决Rusup#988之前,不幸的是,没有自动化的方法。
要解决问题,请转到命令行并运行:
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
然后返回到VSCODE,然后单击“继续”,以使流式继续安装。
Rust Analyzer不支持MIR和借用检查器,这是流动层分析的重要部分。这个事实不太可能在很长一段时间内改变,因此流动性是独立的工具。
请参阅已知问题的局限性。如果那没有解释您所看到的内容,请在意外的亮点问题中发布或在不和谐问题上询问。