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);
}