English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

konuk
1 / ?
derslere geri dön

İsimlemek Bulmak Değildir

Artık yedi MOAD desenini biliyorsunuz. İsimleri bilmek önemlidir: bir deseni gördüğünüzde tanımanızı sağlar. Ancak kontrollü bir derste tanınma, hiç açmadığınız bir kod tabanında algılama ile farklıdır.

Bir kod tabanı kusurlarına etiket koymaz. Tortul bir MOAD, // O(N²) — bunu düzelt diyen bir yorum ile gelmez. Gürültülü bir sürü, kendisini önbellek kaçırma izdihamı olarak duyurmuyor. Bunları spesifik bir soruyu aklınızda tutarak kod okuyarak bulursunuz: bu değerleri hangi veri yapısı tutuyor ve hangi işlemler bir döngü içinde buna karşı çalışıyor?

Algılama tanımaktan ayrı bir beceridir. Tanıma şöyle der: evet, o desen MOAD-0001. Algılama şöyle der: bu kod tabanında o desenin var olabileceği tüm yerleri bulmama izin ver, tam kodu görsem de sadece sembol adını görsem de.

Yedi MOAD: alt katmanları, imzaları, düzeltmeleri

İlk Tarama

İlk geçiş grep kullanır. Her MOAD'ın bir alt katmanı vardır: belirli işlemlerin yanında var olan ve araştırmaya değer bir sinyal olan veri yapısı veya API.

MOAD-0001 (Tortul): döngüde List.contains

# Sinyal: döngü içinde bir liste değişkeni üzerinde üyelik testi
grep -rn '.contains(' src/ | grep -v HashSet | grep -v TreeSet
grep -rn 'visited =' src/ | grep -v set | grep -v Set

MOAD-0002 (İç İçe Geçme): fazlarda paylaşılan değişebilir bayrak

# Sinyal: bir alt sistem tarafından yazılan, başka bir alt sistem tarafından okunan statik değişebilir alan
grep -rn 'static ' src/ | grep -v final | grep -v class | grep -v void

MOAD-0003 (Sızdırılan Bağlam): havuza alınmış yürütücüde ThreadLocal

# Sinyal: ThreadLocal.remove() garantisi olmayan ThreadLocal.set()
grep -rn 'ThreadLocal' src/
grep -rn 'ThreadLocal.set' src/ -l

MOAD-0004 (Günlüğe Kaydedilen Gizli): HTTP başlıkları günlük çıktısında

# Sinyal: auth uç noktaları yakınında başlıklar değişkeni ile günlük çağrısı
grep -rn 'log.*header' src/
grep -rn 'Authorization' src/ --include='*.log'

MOAD-0005 (Gürültülü Sürü): eşitleme olmayan önbellek kaçırması

# Sinyal: cache.get() + null kontrolü + cache.put() kilitsiz
grep -rn 'cache.get' src/ -A4 | grep 'cache.put'

Bu desenler adaylar üretir, doğrulanmış kusurlar değil. Her aday değerlendirme gerektirir: çevre kodu okuyun, veri yapısı türünü doğrulayın, işlemin ölçekte çalıştığını doğrulayın.

MOAD-0001'den MOAD-0005'e kadar bir MOAD seçin. Hiç açmadığınız bir kod tabanında yapacağınız somut bir algılama adımını açıklayın: ne arayacağınız, pozitif bir bulunuş neye benziyor, & doğrulanmış kusuru yanlış pozitiften ne ayırt ediyor.

Karmaşıklık için Kod Okuma

Grep adaylar bulur. Okuma onları doğrular. Aday dosyayı açtığınızda, bir soruyla okursunuz: bu işlemin maliyeti giriş boyutu ile büyür mü?

MOAD-0001 için, doğrulama protokolü:

1. Dış döngüyü bulun. Yineleme sayısını ne sınırlandırır?
2. İç işlemi bulun (.contains, .indexOf, 'in'). Hangi veri yapısı üzerinde çalışır?
3. O veri yapısı, dış döngüyü yönlendiren aynı giriş ile büyür mü?
4. Evetse: maliyet O(N²) olur, burada N = giriş boyutu. Doğrulanmış kusur.
5. Hayırsa: iç yapı sınırlıdır (yapılandırma, enum, küçük sabit). Yanlış pozitif.

N düğümü ziyaret eden, her adımda visited listesini kontrol eden bir grafik geçişi: hem döngü hem de iç veri yapısı N ile büyür. Doğrulanmış.

Bir istek işleyicisi 5 yönetici IP'den oluşan bir izin listesi kontrol eder: izin listesi hiçbir zaman istek hacmi ile büyümez. Yanlış pozitif.

Aynı protokol her MOAD'a uygulanır: dış sürücüyü tanımlayın, iç yapıyı tanımlayın, her ikisinin ölçekle birlikte büyüyüp büyümediğini sorun.

Dalgalanma Puanı: Bulgularınızın Önceliklendirilmesi

Tüm doğrulanmış kusurlar hemen tamir gerektirmez. 10.000 alt kademeli bağımlısı olan bir kütüphanedeki MOAD, özel bir dahili aracı olan aynı MOAD'dan daha yüksek dalgalanma puanına sahiptir.

Dalgalanma puanı = hızlanma × giriş derecesi. Hızlanma: tipik üretim ölçeğinde düzeltme ne kadar daha hızlı çalışır? Giriş derecesi: alt kademeli paket veya hizmet kaç tane, yukarı kademeli birleştirildiğinde değişiklikleri otomatik olarak devralır?

Doğrulanmış MOAD-0001 Apache Maven bağımlılık çözücüsü'nde, 50.000 düğümlük grafikler üzerinde çalışan, Maven eklentileri otomatik olarak başarısız değişiklikleri devralacak 1.000+ ile: dalgalanma puanı çok yüksek. Bu düzeltme sıra başında yer alır.

Doğrulanmış MOAD-0001 hiç bağımlısı olmayan tek kullanıcılı CLI aracında: dalgalanma puanı sıfıra yakın. Tamir değer, ancak acil değil.

Çalışkanlık vs. açgözlü düğümler. Yüksek ara geçişlilik & yüksek hızlanma ile düğüm çalışkandır: kritik akışı işler & kilidinin açılması alt kademeli kuyrukları temizler. Bunu ancak alt kademeli kapasite doğrulandıktan sonra tamir edin. Yüksek çıkış derecesi & düşük hızlanma ile düğüm açgözlüdür: kendisine verilen her şeyi tüketir ve acı duymaz. Çalışkan düğümün kilidini açgözlü düğüne hemen tamir etmeden katma MOAD-0005'i (gürültülü sürü) altyapı ölçeğinde yaratır.

Fabrika DAG: çalışkan & açgözlü düğüm desenleri

MOAD-0001'i iki yerde doğruladınız: (A) 200.000 etkin projeye sahip bir derleme aracında bağımlılık çözücü, 10.000 düğümlü bağımlılık ağaçları üzerinde çalışan; (B) tek bir şirketteki dahili veri ardışık düzenindeki grafik yardımcı, 50 düğümlü ağaçlar üzerinde çalışan. Dalgalanma puanlarını karşılaştırın. Hangisini önce tamir edersiniz ve açıklamadan önce hangi adımları atarsınız?

Taramadan Birleştirmeye: Bir MOAD Ardışık Düzeni

Doğrulanmış kusur yüksek dalgalanma puanı ile bir ardışık düzenden geçer. Her aşama yapı meydana getirir. Hiçbir aşama isteğe bağlı değildir.

tarama   → aday listesi (grep çıktısı, statik analiz sonuçları)
bileti   → kusur açıklaması (MOAD numarası, konum, karmaşıklık analizi)
yama     → kod değişikliği (veri yapısı değişimi, ilkel benimseme)
test     → birim testi (O(1) kanıtı: N=100 ve N=10.000 düzeltme zamanı)
UNDF     → genel açıklama yazısı (undefect.com, kamu malı)
açıklama → güvenlikle ilgili CVE veya CWE referansı
PR       → yukarı kademeli çekme isteği yama + test + UNDF bağlantısı ile
birleştir → bakıcı kabulü; düzeltme sürüm yükseltmesi yoluyla yayılır

Her yapı sonraki aşamayı besler. Test olmayan yama doğrulanamaz. Açıklama olmayan test aynı deseni başka örneklere yayılamaz. Yukarı kademeli PR olmayan açıklama düzeltmeyi çatallı kalmış bırakır.

Bir MOAD yazısı (UNDF) çoğu mühendisinin atlayacağı aşamadır. Kusuru tamir ederler, PR gönderirler ve kendilerini bitmiş sayarlar. Ancak adlandırılmış yazı olmayan bir düzeltme, gelecek mühendisinin aynı deseni karşılaştığında sorunu hem de düzeltmeyi bağımsız olarak yeniden keşfetmesi anlamına gelir. Bir MOAD yazısı bilgi döngüsünü kapatır: deseni adlandırır, algılama yöntemini gösterir, & yamaya bağlanır. Gelecek araştırmacılar desenin adı için arama yaparak düzeltmeyi bulurlar.

Gezegen tamiratı ölçekte. Yaygın olarak kullanılan bir kütüphanedeki tek bir MOAD-0001 düzeltmesi, onu yapan her projeye yayılır. Bir MOAD yazısı, o kütüphaneyi asla yükseltmeyecek projeler içindeki mühendislerin de düzeltmeyi öğrenmesini sağlar. Her iki yol paralel olarak çalışır.

Kusur Bileti Yazma

İyi bir kusur bileti beş soruyu yanıtlar:

1. Nerede: kesin dosya, sınıf, işlev ve satır aralığı
2. Ne: veri yapısı türü ve buna karşı işlem
3. Neden: karmaşıklık analizi (O(N²) veya daha kötü, N tanımlı)
4. Etki: en kötü durumu tetikleyen girdiler, hangi ölçekte
5. Düzeltme: ikame edilecek veri yapısı veya ilkel

Tüm beşi yanıtlayan bileti bağımsızdır: hiç analizinizi okumamış bir bakıcı bulguyu yeniden üretip düzeltmeyi doğrulayabilir. (3) veya (4) atlayan biletler bakıcıdan birleştirmeden önce karmaşıklık analizinizi tekrar yapmasını gerektirir. Bu sürtünme birleştirme olasılığını azaltır.

İtibarların bileşimi. İyi bileti, hedeflenmiş yamayı ve benchmark testini içeren ilk PR birleştirilir. İkinci PR aynı yazardan daha az sürtünme ile incelenir. Üçüncü PR, ilk ikisini birleştiren bakıcı tarafından incelenir. Açık kaynakta itibar yapı-yapı ledgeridir: kabul edilen her yama sonraki için güven kazanır.

Grafik kütüphanesinde bulmanız beklenen MOAD-0001 için minimal bir kusur bileti yazın. İçerir: (1) makul dosya/işlev adı, (2) veri yapısı & işlem, (3) karmaşıklık açıklaması, (4) tipik etki senaryosu, (5) düzeltme.

Gerçek Bir Adayı Okuma

Python'da gerçek MOAD-0001 adayı aşağıda. Okuyun ve triaj protokolünü tamamlayın.

class DependencyResolver:
    def resolve(self, package, resolved=None, seen=None):
        if resolved is None:
            resolved = []
        if seen is None:
            seen = []
        if package in seen:
            return
        seen.append(package)
        for dep in self.registry.get_dependencies(package):
            self.resolve(dep, resolved, seen)
        resolved.append(package)
        return resolved

Triaj soruları:

1. `seen` veri yapısı nedir?
2. 6. satırda hangi işlem buna karşı çalışır?
3. `seen` giriş boyutu ile büyür mü?
4. Özyinelemeli çağrıları yönlendiren döngü giriş boyutu ile büyür mü?
5. Bu doğrulanmış MOAD-0001 veya yanlış pozitif mi?
Bu kod için beş triaj sorusunun hepsini çalışın. Sonra tek satırlı düzeltmeyi yazın ve neden işlevin çıktısını değiştirmediğini açıklayın.

Sizin Yamınız

Yüksek dalgalanma puanı ile doğrulanmış kusur tam yama gerektirir: kod düzeltmesi, iyileştirmeyi kanıtlayan test, & MOAD yazısı taslağı.

Test doğruluk testi değil, performans testi olmalıdır. Doğruluk testi düzeltmeden önce ve sonra geçer — bu noktadır; çıktı değişmez. İki giriş boyutunda performans testi iyileştirmeyi kanıtlar:

import time

def build_graph(n):
    # n paket, her biri önceki olana bağlı
    return {f'pkg{i}': [f'pkg{i-1}'] if i > 0 else [] for i in range(n)}

for n in [100, 1000, 5000]:
    registry = build_graph(n)
    resolver = DependencyResolver(registry)
    start = time.perf_counter()
    resolver.resolve(f'pkg{n-1}')
    elapsed = time.perf_counter() - start
    print(f'n={n}: {elapsed:.4f}s')

Düzeltmeden önce, geçen zaman n ile ikinci dereceden büyür. Düzeltmeden sonra, doğrusal olarak büyür. Her ikisini yazdırın ve sayıları PR açıklamanıza dahil edin.

MOAD yazı taslağı şunları kapsar: desen adı, alt katman (Python bağımlılık çözücüsü), algılama yöntemi (grep in seen burada seen [] olarak başlar), düzeltme, & PR bağlantısı. Yazı undefect.com'a kamu malı olarak gider. 'Python listesi döngüde üyelik yavaş' arayan gelecek mühendisleri bulurlar.

Popüler Python paketleme aracında MOAD-0001'i doğrulayıp tamir ettiniz. PR açmadan önce, PR açıklamasında hangi üç şeyi dahil edersiniz ve neden her biri bakıcı için önemlidir?