流程度是分析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和借用檢查器,這是流動層分析的重要部分。這個事實不太可能在很長一段時間內改變,因此流動性是獨立的工具。
請參閱已知問題的局限性。如果那沒有解釋您所看到的內容,請在意外的亮點問題中發布或在不和諧問題上詢問。