SnoopStop

SnoopStop Origin

C ya da Rust kodunuzu yapıştırın. Her dizi erişimi, bölme ve tamsayı işlemi için iki sonuçtan birini verir: ya tüm girdilerde güvenli olduğunu matematiksel olarak kanıtlar ya da açığı tetikleyen gerçek girdiyi bulur, onu çalıştırıp gösterir ve kapattığı yeniden kanıtlanmış bir yama önerir.

18denetlenen hata türü
0bayt kod sunucuya gider
226otomatik sınama adımı
0 ₺ücret

Deneme sürümü. Şimdilik C'nin bir bölümünü anlar: tüm tamsayı türleri (char, short, int, long, unsigned, size_t), bunların dizileri, metinler, döngüler, koşullar, kendi fonksiyonlarınız ve strcpy, strcat, strncpy, strlen, memcpy, memset gibi kütüphane fonksiyonları, işaretçiler (*p, p + i, &a[i], NULL) ve malloc / calloc / free. ve struct (s.x, p->x, a[i].x, p->ad[i], typedef). İşaretçinin işaretçisi ve işaretçi tutan alanlar henüz yok. Eşzamanlılık ve yetki (yeni): genel değişkenler, pthread_mutex_t kilitleri, //@ guarded_by m (veri yarışı), çift kilitleme ve kilidi açık bırakarak dönme; //@ grants X if ... / //@ requires \granted(X) ile bildirilen yetki modeli. Kural sizin bildirdiğinizdir; araç onun her yolda tuttuğunu kanıtlar. İş parçacıklarının araya girme sıraları tek tek denenmez: kilit disiplinine uyan kodda yarış olmaz, uymayan yol gösterilir. Rust (yeni): tamsayı türleri, dilimler (&[T], &mut [T]), diziler ([v; N]), alt dilimler (&a[i..j]), .len(), for / while, if ifadeleri, as, wrapping_*, assert! / panic!. Taşma denetimi açık derleme varsayılır (taşma panik sayılır). Yapılar, Vec, yineleyiciler henüz yok; otomatik yama ve "Hepsini düzelt" şimdilik yalnız C için. "Kanıtlandı" yalnız aşağıda listelenen özellikler için geçerlidir ve bu aracın doğru çalıştığı varsayımına dayanır; bağımsız bir denetimden geçmedi. Güvenlik incelemesinin yerini tutmaz.

Origin Pro · deneme

Bütün projeyi tara, denetim raporu al

Bir klasör ya da birden çok dosya seç (.c ve .rs). Hepsi bu tarayıcıda, sırayla incelenir; kod hiçbir yere gönderilmez. Sonunda bulguları, tetikleyen girdileri ve kanıtlananları içeren bir rapor indirirsin; tarayıcıda açıp "PDF olarak kaydet" diyebilirsin.

    Nasıl çalışır

    1. Her riskli işlem bir soruya dönüşür. "Bu a[i] hiç dizinin dışına çıkabilir mi?", "Bu bölmede payda sıfır olabilir mi?" gibi. Sorular 32 bitlik makine aritmetiğiyle, taşmalar dahil, birebir yazılır.
    2. Z3 ispat motoru yanıtlar. "Olamaz" derse özellik tüm olası girdiler için kanıtlanmıştır. Döngüler için gereken değişmezleri (ör. 0 <= i <= n) araç kendisi bulur; isterseniz siz de yazabilirsiniz.
    3. "Olabilir" derse karşı örnek gerçekten çalıştırılır. Motorun verdiği girdiyle kod, C'nin kurallarına göre adım adım yürütülür. Açık orada gerçekten oluşmazsa raporlanmaz; yanlış alarm yerine "kanıtlanamadı" yazılır.
    4. Yamalar da kanıtlanır. Önerilen her düzeltme koda uygulanıp baştan analiz edilir. Yalnız açığı kapattığı kanıtlanan ve yeni açık getirmeyen yamalar gösterilir.

    Analiz tamamen bu sekmede, WebAssembly'ye derlenmiş Z3 (MIT lisanslı) ile yapılır. Kodunuz hiçbir sunucuya gönderilmez. Her kanıt SMT-LIB dosyası olarak indirilebilir ve başka bir çözücüyle (ör. cvc5) yeniden denetlenebilir. Komut satırı ve GitHub sürümü, isterseniz kendi seçtiğiniz yapay zekâdan (Claude, OpenAI, Gemini ya da bilgisayarınızdaki Ollama) eksik döngü değişmezlerini önermesini isteyip her öneriyi Z3'e yeniden kanıtlatır; bu sayfadaki araç yapay zekâ kullanmaz.

    Ne denetler

    HataÖrnekCWE
    Dizi sınırı dışına okuma / yazmaa[n], a[-1]125 / 787
    Kütüphane çağrısında tampon taşmasıstrcpy, strcat, memcpy hedefi aşıyor120
    Sonlandırılmamış metinstrncpy sonrası \0 yok, char t[3] = "abc"170
    NULL işaretçi kullanımı (denetlenmeyen malloc dahil)p = malloc(n); p[0] = 1;476 / 690
    Serbest bırakılmış belleği kullanmafree(p); return p[0];416
    Çift ya da geçersiz freefree(p); free(p);, yığındaki diziyi free415 / 761
    Değer kesilmesi (daraltma)char c = 300;, unsigned char b = x;197
    Tamsayı taşması(lo + hi) / 2, -INT_MIN190
    Sıfıra bölmes / n, x % 0369
    Geçersiz kaydırmax << 32, -1 << 31335
    Başlatılmamış değişkenint x; return x;457
    Değer döndürmeden biten fonksiyonif (x) return 1; ve son758
    Çağrıda ön koşul ihlalisözleşmesi olan fonksiyona yanlış değer–
    Son koşul ve döngü değişmezi//@ ensures, //@ invariant–
    assertassert(n > 0);617

    Sözleşme yazmak (isteğe bağlı)

    Hiçbir şey yazmadan da çalışır. Bir fonksiyonun neyi varsaydığını ve neyi garanti ettiğini yazarsanız, araç bunları da kanıtlar ve çağıran her yerde denetler.

    //@ requires 0 <= i && i < n;      // çağıran bunu sağlamalı
    //@ ensures \result >= 0;            // fonksiyon bunu garanti eder
    int al(int a[], int n, int i) { ... }
    
    //@ invariant 0 <= i && i <= n;      // döngünün her turunda doğru
    for (int i = 0; i < n; i++) { ... }

    C'de bir dizinin uzunluğu bilinmez. int a[], int n kalıbında n'nin a'nın uzunluğu olduğu varsayılır ve sonuçta yazılır. Başka bir ilişki için //@ requires len(a) >= m; yazın.

    Bilinen sınırlar

    • İşaretçinin işaretçisi (**p), işaretçi ya da iç içe yapı tutan alanlar, yapının değerle geçirilmesi, fonksiyon işaretçileri, realloc, float, break, switch ve listede olmayan kütüphane fonksiyonları desteklenmiyor; görürse açıkça söyler.
    • Fonksiyona verilen işaretçi parametrelerinin NULL olmadığı varsayılır. malloc'un ise gerçekte olduğu gibi NULL döndürebileceği hesaba katılır.
    • Veri modeli 64 bit Linux/macOS'tur (LP64): long ve size_t 64 bit. İşaretsiz taşma C'de tanımlı olduğu için açık sayılmaz; yol açtığı dizi taşması yakalanır.
    • Bir özellik kanıtlanamazsa döngüler belirli bir tur sayısına kadar denenir; bu "güvenli" demek değildir.
    • Sözleşmesiz özyinelemeli fonksiyonların sonucu bilinmiyor sayılır.
    • İlk analizde ispat motoru indirilir (yaklaşık 10 MB sıkıştırılmış); sonra tarayıcı önbelleğinden gelir.