Flowistry هي أداة تحلل تدفق المعلومات لبرامج الصدأ. يدرك Flowistry ما إذا كان من الممكن أن تؤثر قطعة رمز على شيء آخر. تتكامل Flowistry في IDE لتوفير "وضع التركيز" الذي يساعدك على التركيز على الرمز المتعلق بمهمتك الحالية.
على سبيل المثال ، يعرض GIF وضع التركيز عند قراءة وظيفة تقوم بها النقابات ببعضها البعض:

عندما ينقر المستخدم على متغير معين أو تعبير ، فإن Flowistry تتلاشى جميع الكود الذي لا يؤثر على هذا الرمز ، ولا يتأثر بهذا الرمز. على سبيل المثال ، لا تتأثر orig_len بالقدوم ، بينما set.len() هو.
يمكن أن يكون التدفق مفيدًا عندما تقرأ وظيفة مع الكثير من التعليمات البرمجية. على سبيل المثال ، يعرض GIF وظيفة حقيقية في برنامج التحويل البرمجي للصدأ. إذا كنت تريد أن تفهم دور وسيطة محددة للوظيفة ، فيمكن أن يقوم Flowistry بتصفية معظم الكود على أنه غير ذي صلة:

تم نشر الخوارزمية التي تدفق القوى في الورقة "تدفق المعلومات المعيارية من خلال الملكية" في PLDI 2022.
جدول المحتويات
يتوفر Flowistry كمساعد VSCode. يمكنك تثبيت التدفق من سوق Visual Studio أو سجل VSX المفتوح. في VSCODE:
ملاحظة حول دعم النظام الأساسي: لا تدعم Flowistry Nixos بعد. لا يمكن لـ Flowistry توفير ثنائيات تم إنشاؤها مسبقًا لأهداف ARM مثل M1 Macs ، لذلك يجب تثبيت التدفق من نقطة الصفر على هذه الأهداف (يتم ذلك من أجلك ، ولكن سيستغرق بضع دقائق أكثر من المعتاد).
بدلاً من ذلك ، يمكنك تثبيته من المصدر:
# 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 المنشور على Cats.io: https://crates.io/crates/flowistry
تم نشر الوثائق هنا: https://willcrichton.net/flowistry/flowistry/
ملاحظة: لا تدعم Docs.RS وثائق الصناديق التي تستخدم
#![feature(rustc_private)]
لاحظ أن أحدث تدفق يحتوي على إصدار صدأ مخصص من Rust 1.73 . لا يضمن التدفق العمل مع الميزات التي تم تنفيذها بعد 1.73.
بمجرد تثبيت التدفق ، افتح مساحة عمل للصدأ في VSCode. يجب أن ترى هذا الرمز في شريط الأدوات السفلي:

يبدأ Flowistry عن طريق تحديد نوع قاعدة الشفرة الخاصة بك. قد يستغرق هذا بضع دقائق إذا كان لديك العديد من التبعيات.
ملاحظة: يتم تخزين نتائج فحص نوع التدفق في دليل
target/flowistry. إذا قمت بحذف هذا المجلد ، فسيتعين على التدفق إعادة حساب الأنواع. أيضًا للحصول على قاعدة كود كبيرة ، قد يستغرق هذا الدليل قدرًا لا بأس به من مساحة القرص.
بمجرد أن يتم تشغيل التدفق ، سوف تختفي أيقونة التحميل. بعد ذلك ، يمكنك إدخال وضع التركيز عن طريق تشغيل الأمر "Toggle Focus Mode". بشكل افتراضي ، فإن اختصار لوحة المفاتيح هو Ctrl+r Ctrl+A (⌘+r ⌘+A على Mac) ، أو يمكنك استخدام قائمة سياق التدفق:

في وضع التركيز ، ستقوم التدفق تلقائيًا بحساب تدفق المعلومات داخل وظيفة معينة بمجرد وضع المؤشر هناك. بمجرد الانتهاء من التدفق ، سيبدو شريط الحالة هكذا:

ملاحظة: يمكن أن يكون التدفق بطيئًا بعض الشيء بالنسبة للوظائف الأكبر. قد يستغرق الأمر ما يصل إلى 15 ثانية لإنهاء التحليل.
تدفق التدفق ما تريد التركيز عليه بناءً على المؤشر. لذلك إذا قمت بالنقر فوق متغير ، فيجب أن ترى منطقة التركيز لهذا المتغير. ستسلط Flowistry الضوء على الكود المركّز باللون الرمادي ، ثم تلاشى الكود خارج منطقة التركيز. على سبيل المثال ، نظرًا لأن مؤشر المستخدم يتم عرضه على view_projection ، يتم تمييز هذا المتغير باللون الرمادي ، ويتم عرض منطقة تركيزه.

في بعض الأحيان تريد الاحتفاظ بمنطقة التركيز في مكانها ، وانقر على رمز آخر لتفقده دون تغيير التركيز. لهذا الغرض ، فإن التدفق لديه مفهوم "علامة". بمجرد تحديد رمز للتركيز عليه ، يمكنك تشغيل الأمر "Set Mark" (Ctrl+R Ctrl+S / ⌘+R ⌘+S). ثم يتم تعيين علامة في موضع المؤشر الحالي ، وسيبقى التركيز هناك حتى تقوم بتشغيل أمر "unset Mark" (Ctrl+R Ctrl+D / ⌘+R ⌘+D).
إذا كنت ترغب في تعديل جميع التعليمات البرمجية في منطقة التركيز ، على سبيل المثال للتعليق عليها أو نسخها ، فيمكنك تشغيل الأمر "SELECT FORCUSED RECET" (Ctrl+R Ctrl+T / ⌘+R ⌘+T). سيؤدي ذلك إلى إضافة منطقة التركيز بأكملها إلى اختيار المحرر الخاص بك.
التدفق هو مشروع بحث نشط في تطبيقات تحليل تدفق المعلومات لصدأ. يتطور باستمرار مع تجربة تقنيات التحليل ونماذج التفاعل. لذلك ليس مصقولًا أو فعالًا مثل أدوات مثل Rust Analyzer ، لكننا نأمل أن تتمكن من العثور عليها مفيدة! ومع ذلك ، هناك عدد من القيود المهمة التي يجب أن تفهمها عند استخدام التدفق لتجنب التفاجأ.
إذا كانت لديك أسئلة أو مشكلات ، فيرجى تقديم مشكلة github ، أو الانضمام إلى Discord ، أو DMWcrichton على Twitter.
عندما يكون للكود الخاص بك مراجع ، يحتاج 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 ( ) ) ; يمكن أن تحدد التدفق أن *x.lock().unwrap() = 1 هو طفرة إلى x ، لكنها لا يمكن أن تحدد أنها طفرة إلى y . لذلك إذا ركزت على y ، فسيتم تلاشي المهمة إلى 1 ، على الرغم من أنها ذات صلة بقيمة y
نحن نبحث عن طرق للتغلب على هذا القيد ، ولكن في الوقت الحالي ، كن على علم بأن هذه هي الحالة الرئيسية التي يُعرف فيها التدفق بأنها توفر إجابة غير صحيحة.
يحاول تحليل Flowistry تضمين جميع التعليمات البرمجية التي يمكن أن يكون لها تأثير على نقطة محورية. يجعل هذا التحليل عددًا من الافتراضات للأسباب العملية والأساسية. على سبيل المثال ، في هذا المقتطف:
let mut v = vec ! [ 1 , 2 , 3 ] ;
let x = v . get_mut ( 0 ) ;
println ! ( "{:?} {}" , v , x ) ; إذا ركزت على v على السطر 3 ، فسيتضمن v.get_mut(0) كعملية يمكن أن تعدل v . والسبب هو أن التدفق لا يحلل في الواقع أجسام الوظائف المسمى ، ولكنه يقارب بناءً على توقيعاتهم. نظرًا لأن get_mut يأخذ &mut self كمدخلات ، فإنه يفترض أنه يمكن تعديل المتجه.
بشكل عام ، يجب عليك استخدام وضع التركيز كأداة تقليم. إذا تلاشى الكود ، فلن تضطر إلى قراءته (ناقص القيد المذكور أعلاه!). إذا لم يتلاشى ، فقد يكون ذلك مناسبًا لمهمتك.
تعمل Flowistry من خلال تحليل الرسم البياني MIR لوظيفة معينة باستخدام واجهة برمجة تطبيقات برنامج برنامج التحويل البرمجي. ثم يرفع امتداد IDE ينتج عن التحليل من مستوى MIR إلى مستوى المصدر. ومع ذلك ، يتم فقد الكثير من المعلومات حول البرنامج في الرحلة من كود المصدر إلى MIR.
على سبيل المثال ، إذا كان المصدر يحتوي على تعبير foo.whomp.bar().baz() ، فمن الممكن أن يتم إنشاء متغير مؤقت فقط للتعبير foo.whomp.bar() . لذلك إذا حدد المستخدم foo ، فقد لا يكون Flowistry قادرًا على تحديد أن هذا يتوافق مع مكان MIR الذي يمثل foo .
هذا هو السبب في أن امتداد IDE يسلط الضوء على الرمز المركّز باللون الرمادي ، حتى تتمكن من فهم ما يخطط له اختيار المؤشر.
تحلل التدفق وظيفة واحدة في وقت واحد. إذا كانت الوظيفة تحتوي على وظائف أخرى أو تعريفات fn أو عمليات إغلاق أو ضمنيًا عبر Async ، فإن التدفق ستظهر لك فقط تركيز المناطق ضمن أصغر جسم وظيفي يحتوي على المؤشر. عادةً ما يتم تعريف هذا بشكل جيد لتعريفات الوظائف والإغلاق ، ولكن قد يكون مربكًا للمتزامن لأن ذلك يعتمد على كيفية قرار Rustc بنحت وظيفة Async.
إذا فشل 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 وانقر فوق "متابعة" للسماح للتدفق بالاستمرار في التثبيت.
لا يدعم Rust Analyzer MIR ومدقق الاقتراض ، وهو أجزاء أساسية من تحليل التدفق. من غير المرجح أن تتغير هذه الحقيقة لفترة طويلة ، لذا فإن التدفق أداة مستقلة.
انظر القيود على القضايا المعروفة. إذا لم يفسر ذلك ما تراه ، فيرجى نشره في مشكلة النقاط البارزة غير المتوقعة أو اطلب من الخلاف.