The Chromium Chronicle #25: التعليقات التوضيحية بشأن أمان سلسلة المحادثات

الحلقة 25: من تأليف "فيكتور كوستان" في سنغافورة (تشرين الأول/أكتوبر 2021)
الحلقات السابقة

في لغة C++ ، يكون استبعاد إمكانية سباقات البيانات بمثابة دليل صغير على صحة سلسلة المحادثات لكل وصول عضو بيانات. بل تضيف هذه الأدلة الكثير من المجهود العقلي، خاصةً عند مراجعة التعليمات البرمجية أو إعادة هيكلتها. يتولّى إطار التحليل الثابت الخاص بـ Clang مسؤولية إثباتات أمان سلسلة المحادثات.

إضافة "GUARDED_BY_CONTEXT()" إلى أعضاء البيانات في الصفوف غير الآمنة لسلاسل المحادثات

معظم فئات Chrome غير آمنة لسلاسل المحادثات، ويجب استخدامها على تسلسل واحد. أضِف تعليقات توضيحية إلى جميع أعضاء البيانات غير الآمنة في سلسلة المحادثات. التعليقات التوضيحية غير الضرورية آمنة، لكن عدم وجود التعليقات التوضيحية قد يؤدي إلى حدوث سباقات في البيانات.

#include "base/sequence_checker.h"  // for SEQUENCE_CHECKER()
#include "base/thread_annotations.h"  // for GUARDED_BY_CONTEXT()

class Cache {
  // Methods here.
 private:
  SEQUENCE_CHECKER(sequence_checker_);
  base::flat_map<std::string, std::string> data_ GUARDED_BY_CONTEXT(sequence_checker_);
};

فرض Clang عمليات التحقق من التسلسل

في مقابل التعليق التوضيحي على أعضاء البيانات، تضمن Clang أن تُجري أي طريقة تصل إلى البيانات فحصًا لسلامة التسلسل قبل إجراء ذلك. ومع انتقال الرمز البرمجي في عمليات إعادة الهيكلة، يواصل Clang فرض تعليق GUARDED_BY_CONTEXT() التوضيحي.

void Cache::Set(base::StringPiece key, base::StringPiece value) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);  // Clang warns without this.
  data_.emplace(key, value);
}

إضافة "GUARDED_BY()" إلى أعضاء البيانات في الصفوف الآمنة على شكل سلاسل محادثات التي تستخدم دالة الاستبعاد المتبادل

يجب أن تستخدم بعض الصفوف في Chrome الأقفال للحفاظ على أمان سلسلة المحادثات. في هذه الحالات، قم بإضافة تعليقات توضيحية إلى جميع أعضاء البيانات غير الآمنة في سلسلة المحادثات. يشير كل تعليق توضيحي إلى دالة الاستبعاد المتبادل التي يجب الاحتفاظ بها أثناء الوصول إلى عضو البيانات.

#include "base/thread_annotations.h"  // for GUARDED_BY()

class ThreadSafeCache {
  // Methods here.
  private:
    base::Lock lock_;
    base::flat_map<std::string, std::string> data_ GUARDED_BY(lock_);
};

تطبيق Clang ينفّذ عمليات الاكتساب من خلال القفل

يُرجى الانتظار والسماح للأداة المجمّعة بالتأكّد من تحديد نطاق كل base::AutoLock بشكل صحيح، وأنّ قفل مكالمات Acquire() وRelease() يتم إقرانه بشكل صحيح.

void ThreadSafeCache::Set(base::StringPiece key, base::StringPiece value) {
  base::AutoLock auto_lock(lock_);  // Clang warns without this.
  data_.emplace(key, value);
}