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.
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
- 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. - 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. - "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.
- 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 | Örnek | CWE |
|---|---|---|
| Dizi sınırı dışına okuma / yazma | a[n], a[-1] | 125 / 787 |
| Kütüphane çağrısında tampon taşması | strcpy, strcat, memcpy hedefi aşıyor | 120 |
| Sonlandırılmamış metin | strncpy 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 kullanma | free(p); return p[0]; | 416 |
Çift ya da geçersiz free | free(p); free(p);, yığındaki diziyi free | 415 / 761 |
| Değer kesilmesi (daraltma) | char c = 300;, unsigned char b = x; | 197 |
| Tamsayı taşması | (lo + hi) / 2, -INT_MIN | 190 |
| Sıfıra bölme | s / n, x % 0 | 369 |
| Geçersiz kaydırma | x << 32, -1 << 3 | 1335 |
| Başlatılmamış değişken | int x; return x; | 457 |
| Değer döndürmeden biten fonksiyon | if (x) return 1; ve son | 758 |
| Çağrıda ön koşul ihlali | sözleşmesi olan fonksiyona yanlış değer | – |
| Son koşul ve döngü değişmezi | //@ ensures, //@ invariant | – |
assert | assert(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,switchve 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):
longvesize_t64 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.