Flowistry는 Rust 프로그램의 정보 흐름을 분석하는 도구입니다. Flowistry는 한 조각의 코드가 다른 코드에 영향을 줄 수 있는지 여부를 이해합니다. Flowistry는 IDE에 통합되어 현재 작업과 관련된 코드에 집중하는 데 도움이되는 "초점 모드"를 제공합니다.
예를 들어,이 GIF는 두 개의 노조가 함께 설정하는 함수를 읽을 때 초점 모드를 보여줍니다.

사용자가 주어진 변수 또는 표현식을 클릭하면 Flowistry는 해당 코드에 영향을 미치지 않는 모든 코드를 사라지고 해당 코드 의 영향을받지 않습니다 . 예를 들어, orig_len for-loop의 영향을받지 않으며 set.len() 은 IS입니다.
Flowistry는 많은 코드로 함수를 읽을 때 도움이 될 수 있습니다. 예를 들어,이 GIF는 Rust 컴파일러에서 실제 기능을 보여줍니다. 함수에 대한 특정 인수의 역할을 이해하려면 Flowistry가 대부분의 코드를 관련이없는 것으로 필터링 할 수 있습니다.

Flowistry에 힘을 발휘하는 알고리즘은 PLDI 2022의 "소유권을 통한 모듈 식 정보 흐름"에 게시되었습니다.
목차
Flowistry는 VScode 플러그인으로 제공됩니다. Visual Studio Marketplace 또는 Open VSX 레지스트리에서 Flowistry를 설치할 수 있습니다. vscode에서 :
플랫폼 지원에 대한 참고 사항 : Flowistry는 아직 닉스를 지원하지 않습니다. Flowistry는 M1 Mac과 같은 ARM 대상에 대해 사전 제작 된 바이너리를 제공 할 수 없으므로 Flowistry는 이러한 대상에 처음부터 처음부터 설치해야합니다 (이것은 귀하를 위해 수행되지만 평소보다 몇 분 더 걸립니다).
또는 소스에서 설치할 수 있습니다.
# 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
기본 분석에 관심이 있으시면 Crates.io에 게시 된 flowistry Create를 사용할 수 있습니다. https://crates.io/crates/flowistry
문서는 여기에 게시되어 있습니다 : https://willcrichton.net/flowistry/flowistry/
참고 : docs.rs는
#![feature(rustc_private)]
최신 Flowistry에는 Rust 1.73 의 최대 지원 Rust 버전이 있습니다. Flowistry는 1.73 이후에 구현 된 기능으로 작동하지 않습니다.
Flowistry를 설치하면 VSCODE에서 Rust Workspace를 엽니 다. 이 아이콘이 하단 도구 모음에 표시됩니다.

Flowistry는 코드베이스 유형을 확인하여 시작합니다. 종속성이 많으면 몇 분이 걸릴 수 있습니다.
참고 : Flowistry Type-Checking 결과는
target/flowistry디렉토리에 캐시됩니다. 이 폴더를 삭제하면 Flowistry가 유형을 다시 작성해야합니다. 또한 큰 코드베이스의 경우이 디렉토리는 상당한 양의 디스크 공간을 차지할 수 있습니다.
Flowistry가 부팅되면 로딩 아이콘이 사라집니다. 그런 다음 "토글 포커스 모드"명령을 실행하여 포커스 모드를 입력 할 수 있습니다. 기본적으로 키보드 바로 가기는 Ctrl+R Ctrl+A (Mac의 ⌘+r ⌘+A)이거나 Flowistry Context 메뉴를 사용할 수 있습니다.

초점 모드에서 Flowistry는 커서를 넣으면 주어진 기능 내에서 정보 흐름을 자동으로 계산합니다. Flowistry가 분석이 완료되면 상태 표시 줄은 다음과 같습니다.

참고 : 더 큰 기능의 경우 유량이 약간 느릴 수 있습니다. 분석을 완료하는 데 최대 15 초가 걸릴 수 있습니다.
Flowistry는 커서를 기준으로 집중하고 싶은 것을 유추합니다. 따라서 변수를 클릭하면 해당 변수의 초점 영역이 표시됩니다. Flowistry는 집중된 코드를 회색으로 강조한 다음 포커스 영역 밖에서 코드를 퇴색시킵니다. 예를 들어, 사용자의 커서가 view_projection 에 있으므로 해당 변수는 회색으로 강조 표시되고 초점 영역이 표시됩니다.

때로는 초점 영역을 유지하고 다른 코드를 클릭하여 초점을 변경하지 않고 검사하기를 원합니다. 이를 위해 Flowistry는 "마크"라는 개념을 가지고 있습니다. 집중할 코드를 선택한 후에는 "set mark"명령 (ctrl+r ctrl+s / ⌘+r ⌘+s)을 실행할 수 있습니다. 그런 다음 마크가 커서의 현재 위치에 설정되며 "Unset Mark"명령 (Ctrl+r Ctrl+d / ⌘+r ⌘+d)을 실행할 때까지 초점이 유지됩니다.
포커스 영역에서 모든 코드를 수정하려면 댓글을 달거나 복사하려면 "Select Foccused Region"명령 (Ctrl+R Ctrl+T / ⌘+r ⌘+T)을 실행할 수 있습니다. 이것은 전체 초점 영역을 편집자 선택에 추가합니다.
Flowistry는 Rust에 대한 정보 흐름 분석 응용 프로그램에 대한 적극적인 연구 프로젝트입니다. 분석 기술과 상호 작용 패러다임을 실험하면서 지속적으로 발전하고 있습니다. 따라서 Rust Analyzer와 같은 도구만큼이나 세련되거나 효율적이지는 않지만 여전히 유용 할 수 있기를 바랍니다. 그럼에도 불구하고, Flowistry를 사용할 때 놀랍지 않도록 이해해야 할 중요한 제한 사항이 여러 가지가 있습니다.
질문이나 문제가 있으면 Github 문제를 제기하거나 Discord에 가입하거나 DM @wcrichton을 트위터에하십시오.
코드에 참조가 있으면 Flowistry는 그 참조 점에서 무엇을 이해해야합니다. Flowistry는 Rust의 수명 정보를 사용하여 포인트-투 정보를 결정합니다. 그러나 Arc<Mutex<T>> 와 같은 내부 돌연변이를 사용하는 데이터 구조는 명시 적으로 동일한 데이터에 대한 포인터간에 수명을 공유 하지 않습니다 . 예를 들어이 스 니펫에서 :
let x = Arc :: new ( Mutex :: new ( 0 ) ) ;
let y = x . clone ( ) ;
* x . lock ( ) . unwrap ( ) = 1 ;
println ! ( "{}" , y . lock ( ) . unwrap ( ) ) ; Flowistry는 *x.lock().unwrap() = 1 x 에 대한 돌연변이이지만, 그것이 y 에 대한 돌연변이라고 판단 할 수는 없다고 결정할 수 있습니다 . 따라서 y 에 집중하면 y 의 값과 관련이 있어도 1에 대한 과제가 사라질 것입니다.
우리는이 제한을 극복하기위한 방법을 연구하고 있지만, 현재로서는 이것이 Flowistry가 잘못된 대답을 제공하는 것으로 알려진 주요 사례라는 것을 알고 있습니다.
Flowistry의 분석은 초점에 영향을 줄 수있는 모든 코드를 포함하려고합니다. 이 분석은 실용적이고 근본적인 이유 모두에 대해 여러 가지 가정을 만듭니다. 예를 들어이 스 니펫에서 :
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; 3 행에서 v 에 집중하면 v.get_mut(0) v 수있는 작업으로 포함합니다. 그 이유는 Flowistry가 실제로 호출 된 기능의 본문을 분석하는 것이 아니라 유형 서명에 따라 근사하기 때문입니다. get_mut &mut self 입력으로 가져 가기 때문에 벡터를 수정할 수 있다고 가정합니다.
일반적으로 Focus Mode를 가지 치기 도구로 사용해야합니다. 코드가 사라지면 읽을 필요가 없습니다 (위에서 언급 한 제한을 제외하고). 사라지지 않으면 작업과 관련이있을 수 있습니다.
Flowistry는 Rust Compiler의 API를 사용하여 주어진 함수의 miR 그래프를 분석하여 작동합니다. 그런 다음 IDE 확장은 MIR 레벨에서 소스 레벨로 분석 결과를 들어 올립니다. 그러나 소스 코드에서 miR 로의 여정에서 프로그램에 대한 많은 정보가 손실됩니다.
예를 들어, 소스에 expression foo.whomp.bar().baz() 포함 된 경우, 임시 변수는 foo.whomp.bar() 에 대해서만 생성 될 수 있습니다. 따라서 사용자가 foo 선택하면 Flowistry가 foo 나타내는 MIR 장소에 해당한다고 판단 할 수 없습니다.
이것이 IDE 확장자가 집중된 코드를 회색으로 강조하는 이유이므로 커서의 선택이 실제로 매핑되는 것을 이해할 수 있습니다.
Flowistry는 한 번에 단일 기능을 분석합니다. 함수에 다른 함수, 예를 들어 fn 정의 또는 클로저, 또는 암시 적으로 비동기를 통한 경우 Flowistry는 커서를 포함하는 가장 작은 기능 본체 내에서만 초점 영역을 보여줍니다. 이것은 일반적으로 기능 정의 및 클로저에 대해 잘 정의되지만 Async에 대해 혼란 스러울 수 있습니다. Rustc가 비동기 기능을 개척하기로 결정하는 방법에 따라 다릅니다.
Rustup이 실패하면 특히 "다운로드 된 파일 이름을 바꿀 수 없음"과 같은 오류가 발생하면 Flowistry가 Rustup이 다른 도구 (Rust-Analyzer)와 동시에 실행되기 때문일 수 있습니다. Rustup#988이 해결 될 때까지 불행히도 이것에 대해 자동화 된 방법이 없습니다.
문제를 해결하려면 명령 줄로 이동하여 실행하십시오.
rustup toolchain install nightly-2023-08-25 -c rust-src -c rustc-dev -c llvm-tools-preview
그런 다음 Vscode로 돌아가서 "계속"을 클릭하여 Flowistry가 계속 설치할 수 있도록하십시오.
Rust Analyzer는 Flowistry 분석의 필수 부분 인 MIR 및 차용 검사기를 지원하지 않습니다. 그 사실은 오랫동안 변하지 않을 것이므로 Flowistry는 독립형 도구입니다.
알려진 문제에 대한 제한 사항을 참조하십시오. 그것이 당신이보고있는 것을 설명하지 않으면, 예기치 않은 하이라이트 문제에 게시하거나 불화를 물어보십시오.