Kod analizi, uzun yıllar boyunca yalnızca hata ayıklama, performans iyileştirme ve güvenlik açıklarının belirlenmesi için başvurulan bir pratikti. Ancak yazılımın yaşam döngüsü Git tabanlı işbirliği, paket yöneticileriyle artan yeniden kullanım, “kütüphaneden aldım—biraz değiştirdim” kültürü ve eğitimde yaygınlaşan çevrimiçi değerlendirmenin etkisiyle karmaşıklaştı. Bu karmaşıklık, intihal (plagiarism) riskini hem akademide hem de endüstride artırdı: Stack Overflow’dan alınan yanıtların “kredi” verilmeden ürüne girmesi, lisansı ihlâl eden kopya kod parçaları, stajyer projelerinde açık kaynak kodun “küçük rötuşlarla” sahiplenilmesi, kurum içinde bir ekibin diğer ekibin özgün çözümünü izinsiz yeniden paketlemesi, hatta kod yarışmalarında bilinen çözümlerin “maskelenmiş” sürümleri…

1) Sorunun Çerçevesi: Neden “Otomatik” ve Neden “Kanıtlanabilir”?
Kod intihalinde asıl zorluk, kopyanın maskeleme teknikleriyle gizlenebilmesidir: değişken adlarını ve yorumları değiştirmek, satır düzenini oynatmak, fonksiyonları küçük parçalara bölmek/tekleştirmek, hatta kodu başka dile çevirip sonra yeniden derlemek… Bu nedenle salt satır/sözcük benzerliğine dayanan araçlar eksik kalır. Otomatik bir sistem; sürekli entegrasyon (CI) hattında, pull request (PR) anında, yarışma tesliminde veya ödev yüklemesinde yerinde analiz yapar. Kanıtlanabilirlik ise raporun ikna gücüdür: “Neden uyardık?” sorusunu yan yana pasajlar, yapısal eşleşme grafikleri, test/davranış izleri ve lisans köprüleriyle şeffafça yanıtlar.
2) Veri Boru Hattı: Kaynaktan Kanıta Giden Yol
-
Toplama katmanı: Kod snapshot’ı (PR diff, yarışma yüklemesi, ödev paketi), repo meta-verisi (yazar, tarih, commit ağacı), paket yönetici manifest’leri, lisans dosyaları.
-
Ön işleme: Dil tespiti, yorum/boşluk temizliği, biçimlendirici normalize (formatter), tokenizasyon, ID obfuscation (değişken/adlandırma soyutlaması).
-
Özellik çıkarımı:
-
Yüzeysel: n-gram, shingling, winnowing.
-
Yapısal: AST (Abstract Syntax Tree), CFG (Control Flow Graph), PDG (Program Dependence Graph).
-
Anlamsal: Orta temsil (IR), gömlemeler (code2vec/codeBERT türü), call-graph.
-
Stilometrik: Adlandırma tarzı, girinti (indent), boşluk/brace alışkanlıkları, yorum tonu.
-
-
Karar füzyonu: Çoklu sinyali ağırlıklı veya kural temelli birleştirme; eşik profilleri (dil/alan/görev).
-
Rapor üretimi: Kanıt kartı (yan yana pasaj, AST-ALT eşleşmesi, CFG izleri, test/davranış eşleşmesi, lisans/kredi önerisi).
3) Yüzeysel Benzerlik: Hızlı Aday Tarama
-
n-gram shingle & winnowing: Büyük dosyalarda hız için ideal; satırların küçük permütasyonlarına tolerans.
-
Edit distance (Levenshtein): Kısa snippet düzeltmeleri ve “kopyala–yapıştır–maskele” paternlerini işaretler.
-
Sınırı: Yüzey değişimiyle rahatlıkla geçilebilir; bu yüzden adaylaştırma amacıyla kullanılır.
4) Yapısal Analiz: AST/CFG ile Maskeyi Kaldırmak
-
AST eşleşmesi: Düğüm türleri, alt ağaç dizilişleri, ifadelerin sıradizimi; değişken/işlev adları gizlense bile yapı sabittir.
-
CFG eşleşmesi: Koşullu dallar, döngüler, istisna yolları, erken dönüşler (early return), “guard” paternleri.
-
PDG ve slice’lar: Veri–kontrol bağımlılıkları üzerinden “aynı mantık akışı”nı yakalar.
-
Kırmızı bayraklar: Nadir hata imzası (aynı kenar durumda aynı istisna), sihirli sayılar, “gereksiz ama aynı” mikro-optimizasyon.
5) Anlamsal Benzerlik: IR ve Gömleme Tabanlı Yaklaşım
-
Orta temsil (IR): LLVM IR/bytecode düzeyi eşleştirme; farklı diller arası (cross-language) maskelemede değerli.
-
Gömlemeler: Kod parçalarını semantik uzayda yakınlaştırır; farklı sözdizimleriyle aynı niyeti yakalar.
-
Uyarı: Gömleme benzerliği tek başına hüküm vermez; yapısal ve delille birleşmelidir.
6) Stilometri: “Üslup Kırılması” ve YZ-Parafraz İzleri
-
Kod üslubu (indent, brace stili, satır sonu, adlandırma uzunluğu, camelCase_vs_snake_case) ve yorum dili kişiye özeldir.
-
Bir dosyada bir bölümün ani üslup değişimi veya YZ-parafraz araçlarının tipik şablon yorumları (ör. “This function does X by using Y approach”) güçlü bir aday sinyalidir.
-
Stilometri; yanlış pozitif üretmemek için yapısal bulgularla birleştirilmelidir.
7) Davranışsal Parmak İzi: Test İzleri ve Koşum Profili
-
Test vaka benzerliği: Aynı kenar durumları için aynı test adları/kurulumları.
-
Koşum profili: Zamanlama paternleri, bellek ayrışımı, log çıktılarındaki kalıp sözler; farklı kod, aynı davranış.
-
Fayda: “Kodu yeniden yazdım” diyen ama aynı davranışı millimetrik izlerle koruyan kopyaları yakalar.
8) Lisans ve Provenans: Kopyadan Daha Kritik Olan Şey
-
LICENSE/COPYING dosyaları, dosya başlığı telif bildirimleri,
CREDITS.mdve kaynak linkleri; intihal raporunun etik ayağıdır. -
Açık kaynak kodun lisansı (MIT, Apache-2.0, GPL-3.0, MPL-2.0, BSD-3-Clause…) yeniden kullanım şartlarınıbelirler.
-
Raporlama; benzerlik kadar lisans uyumu ve kredi görünürlüğünü de içermelidir: “Bu dosya Apache-2.0 lisanslı projeden türemiş görünüyor, lisans metni ve bildirim eksik.”
9) YZ-Parafraz ve Kod Üretim Araçlarıyla Maskelenen Kopya
-
Kod üreticiler (LLM tabanlı) “ezber” kodları bazen lisanslı depolardan getirir; üslubu düzeltir ama yapıyı taşır.
-
Tespit için: AST/CFG + gömleme + stilometri üçlüsü, “YZ şablonu” izlerini (aşırı açıklayıcı yorum, generik değişkenler) işaretler.
-
Çözüm: Yasak yerine beyan + atıf kültürü, iç politikada YZ kullanım beyanı ve otomatik “CREDITS” önerileri.
10) Kod Yarışmaları ve Eğitim Senaryoları: Zor Problemler
-
Aynı problemi çözen öğrenciler/katılımcılar doğal olarak benzer mantık kurar.
-
Önleyici istem tasarımı: Rastgele tohumlar, kişisel veri seti varyantları, ek açıklama zorunluluğu (“neden bu strateji?”).
-
Cezadan önce koçluk: İlk vakalarda açıklama ve atıf ekleme, “kendi örneğinle yeniden yaz” önerisi; tekrarda orantılı yaptırım.
11) Kurumsal Depolarda İntihal: İç–Dış Sınırları
-
İç paylaşımlar: Bir ekibin özgün modülünü başka ekibin “kredi/lisans olmadan” devralması.
-
Dış bağımlılıklar: Stack Overflow, GitHub Gist, blog snippet’leri; izin ve kredi sorunu.
-
Politika: PR şablonlarına “kaynaklanan dış kod/kütüphane listesi” alanı, otomatik lisans denetimi,
NOTICEdosyası üretimi.
12) Yanlış Pozitif Azaltma: Beyaz Listeler ve Eşik Profilleri
-
Standart şablonlar (CLI argüman parse, tipik
mainiskeleti), kitaplık boilerplate’leri beyaz listeye alınmalı. -
Dil/alan profilleri: C++’ta şablon kod yoğunluğu farklı, Python’da defacto idyomlar daha fazladır; eşikler dile ve alan tipine göre ayarlanmalı.
-
Kümülatif kanıt: Kırmızı uyarı için en az iki güçlü sinyal + lisans/kredi eksikliği aranmalı.
13) Kanıt Kartı Tasarımı: Neden Uyardık?
-
Yan yana pasajlar: Normalize edilmiş kod vs. olası kaynak; ortak segmentler vurgulu.
-
AST eşleşme görselleştirmesi: Alt ağaçların renk kodlu eşleşmesi; yüzey değişimi olsa da yapı aynı.
-
CFG izleri ve nadir hatalar: Aynı early return/guard; aynı “sihirli sayı”; aynı istisna.
-
Test/davranış izleri: Benzer log veya zamanlama; küçük sapmalar notlu.
-
Lisans/provenans: Kaynak repo/doi/link, lisans koşulları ve önerilen CREDITS şablonu.
-
Eylem butonları: “Atıf ekle”, “Lisans dosyasını dahil et”, “Esin bağlantısı”, “Yeniden yaz rehberi”.
14) İtiraz ve Düzeltme Akışı: Adil Süreç
-
İtiraz kartı: “Bu kod kendi önceki çalışmamdan/ekip içi şablondan/izinli kaynaktan türedi” gibi bağlamlar.
-
Düzeltmeye dönüşüm: İlk ihlalde kredi–lisans ekleme, “yeniden yaz” önerisi, PR’a açıklama notu.
-
Tekrar ve kasıt: Sistematik kopyada orantılı yaptırım; ekip/kurum düzeyinde eğitim ve politika güncellemesi.
15) Rol Bazlı Panolar: Geliştirici, İnceleyici, Uyum, Yönetim
-
Geliştirici: PR anında orijinallik özeti; kırmızı–sarı–yeşil sinyaller; tek tık düzeltme.
-
Kod inceleyici (reviewer): Kanıt kartı kısa özeti, “riskli bloklar”, lisans/NOTICE eksikleri.
-
Uyum/Lisans: Lisans ihlali uyarıları, üçüncü taraf kaynak haritası, düzeltmeye dönüşüm metrikleri.
-
Yönetim: Trendler, yanlış alarm oranı, itiraz çözüm süresi, “etik borç” göstergeleri.
16) CI/CD Entegrasyonu ve Geliştirici Deneyimi
-
Pre-commit hook / pre-push: Hafif aday tarama (n-gram, hızlı AST fingerprint).
-
CI aşaması: Derin analiz (AST/CFG/IR), kanıt kartı üretimi, lisans denetimi.
-
PR şablonu: “Dış esin kaynağı var mı?”, “Lisansınız uyumlu mu?” hızlı kontrol listesi.
-
Geri bildirim tonu: Suçlayıcı değil; koçluk dilinde, eylem önerili.
17) Ölçüm ve Metrikler: Yakalamaktan Çok Onarım
-
Düzeltmeye dönüşüm oranı: Uyarı → atıf/lisans eklendi, yeniden yazıldı.
-
Yanlış alarm ve itiraz çözüm süresi.
-
Kredi görünürlüğü skoru: Repo başına CREDITS/NOTICE kapsamı.
-
YZ kullanım beyanı oranı; güven anketleri (geliştirici ve inceleyici).
18) Eğitim ve Mikro Modüller: Kültürü Küçük Adımlarla Değiştirmek
-
2–3 dakikalık mikro videolar: “Kodda atıf nasıl yapılır?”, “Açık kaynak lisansları 101”, “Stack Overflow snippet’leri ve kredi”, “YZ kullanım beyanı”.
-
İyi örnek galerisi: Harika CREDITS.md, açıklamalı PR’lar, şeffaf lisans ekleme.
-
Oyunlaştırma: “Etik puan” rozetleri; lisans/kredi düzenine katkı ödülleri.
19) Örnek Olay A: Aynı Nadir İstisna ve Sihirli Sayı
Bir Python fonksiyonu, farklı değişken adları ve farklı yorumlarla PR edildi. AST benzerliği yüksek; CFG’de aynı erken dönüş; istisna bloğunda aynı hata mesajı ve THRESHOLD = 37 gibi sihirli sayı. Kanıt kartı, kaynak repo linkini ve Apache-2.0 lisans şartlarını gösteriyor. Geliştirici CREDITS.md ve lisans bildirimini ekliyor; küçük bir refaktörle özgünleştiriyor.
20) Örnek Olay B: Cross-Language Parafraz
C++ kaynaklı bir çözümün Java sürümü PR’a geliyor. Yüzey benzerliği düşük; ancak IR/CFG yakınlığı yüksek, test vakaları aynı. Raporda “çapraz dil eşleşmesi” vurgulanıyor; geliştirici esin linkini ekleyip Java ekosistemine özgü koleksiyonlarla mantığı yeniden kuruyor.
21) Örnek Olay C: YZ-Parafrazın Üslup İzi
Aynı dosyada bir bölüm, “mükemmel” İngilizce yorumlar ve aşırı açıklayıcı fonksiyon adlarıyla beliriyor. Stilometri uyarı veriyor; AST eşleşmesi popüler bir blog çözümüyle yüksek. Geliştirici YZ kullandığını beyan ediyor; kaynak linklerini ve lisans notlarını ekliyor; iki kritik dalı yeniden yazıyor.
22) Örnek Olay D: Kurumiçi “Sessiz Devralma”
Takım B, Takım A’nın iç şablonunu alıp “kredi” vermeden projeye koymuş. Kanıt kartı commit geçmişini, ilk üretici ekip referansını ve yapı eşleşmelerini gösteriyor. Sonuç: CREDITS.md’de kurum içi atıf, şablonun “paylaşım lisansı” eklenmesi, eğitim oturumu.
23) 30–60–90 Günlük Yol Haritası: Pilot → Ayar → Yayılım
-
0–30 gün (Pilot):
-
n-gram/winnowing ile hafif aday tarama, basit AST fingerprint.
-
PR yorumuna gömülen kanıt kartı iskeleti (yan yana pasaj + lisans önerisi).
-
PR şablonuna “dış esin/lisans” alanları.
-
-
31–60 gün (Ayar):
-
AST/CFG/IR derin analiz; “nadir hata/sihirli sayı” yakalama.
-
Lisans/provenans tarayıcı; CREDITS/NOTICE otomasyonu.
-
Eşik profilleri (dil/alan), beyaz liste; stilometri modülü.
-
-
61–90 gün (Yayılım):
-
Rol bazlı panolar; itiraz–düzeltme akışı.
-
Ölçüm panosu: düzeltmeye dönüşüm, yanlış alarm, itiraz süresi.
-
Mikro eğitimler ve “etik puan” programı.
-
24) 180 Gün ve Sonrası: Olgunlaşma ve Otomasyon
-
Davranışsal parmak izi (test/koşum profili) entegrasyonu; cross-language IR genişlemesi.
-
Topluluk modeli: İyi düzeltilmiş vakalardan anonim öğrenme; eşiklerin kendini iyileştirmesi.
-
Stüdyo koçu: IDE eklentisi ile “yazarken” atıf, lisans ve yeniden yaz önerileri.
-
Açık denetim raporları: Kurum içi etik şeffaflık için periyodik özetler.
25) Sınırlar ve Gerçekçilik: Sıfır Yanlış Pozitif Yok
-
Basit problemler doğal benzerlik üretir; karar yalnız eşleşme yüzdesine dayanmamalıdır.
-
YZ araçları bazen “genel” kodlar üretir; stilometri/AST uyarıları koçlukla yönetilmelidir.
-
Amaç “yakalamak”tan çok, kaynakla konuşmayı ve etik atıfı kalıcılaştırmaktır.
Sonuç
“Otomatik İntihal Raporlama”yı kod analizinin yan bileşeni değil, temel kalite disiplini olarak konumlandırdığımızda; yazılım projeleri yalnız çalışırlık ve güvenlik açısından değil, etik şeffaflık bakımından da güçlenir. Bu makalede çizdiğimiz yaklaşım beş omurga üzerine oturur:
-
Çok Katmanlı Tespit: Yüzeysel (n-gram/winnowing) yalnız kapıdır; karar yapısal (AST/CFG/PDG), anlamsal(IR/gömleme), stilometrik (üslup), davranışsal (test/koşum) ve lisans/provenans sinyallerinin birlikteliğiyleverilir.
-
Açıklanabilir Kanıt: Kanıt kartları; yan yana pasajlar, alt ağaç eşleşmeleri, kontrol akış izleri, nadir hata–sihirli sayı, test/davranış benzerliği ve lisans/kredi önerileriyle “Neden?” sorusunu ikna edici biçimde yanıtlar.
-
Önleme ve Koçluk: CI/PR anında geri bildirim, IDE içinde stüdyo koçu, PR şablonlarında esin–lisans alanları; cezadan önce düzeltmeye dönüşüm kültürü.
-
Adil Süreç ve Orantılılık: İlk vakalarda atıf ve yeniden yaz; tekrarda ölçülü yaptırım. İtiraz mekanizması; bağlamı (kendi önceki kodu, kurum içi şablon, açık lisans) dikkate alır.
-
Ölçüm ve Sürekli İyileştirme: Başarı, “yakalama sayısı”yla değil; düzeltmeye dönüşüm, yanlış alarm düşüşü, kredi görünürlüğü ve güven ile ölçülür. Topluluk modeli ve politika güncellemeleri, sistemi canlı tutar.
Böyle bir sistem hayata geçtiğinde; açık kaynakla etik bağ kuran, kaynak gösteren ve ilham aldığı kodu krediyle yaşatan bir mühendislik kültürü doğar. Kod yalnızca çalışan satırlar değil; emeğin izi ve ilişkiler ağı olarak görünür olur. İntihal raporu da bir “suç duyurusu” değil, öğretici bir anlatı ve düzeltme fırsatına dönüşür. Sonunda kazanan; geliştirici, ürün ve topluluktur.
No responses yet