{"id":2293,"date":"2026-03-02T13:00:49","date_gmt":"2026-03-02T12:00:49","guid":{"rendered":"https:\/\/www.dotsource.de\/labs\/?p=2293"},"modified":"2026-04-10T09:28:51","modified_gmt":"2026-04-10T07:28:51","slug":"code-clones-auf-bytecode-finden-nicad-im-test","status":"publish","type":"post","link":"https:\/\/www.dotsource.de\/labs\/code-clones-auf-bytecode-finden-nicad-im-test\/","title":{"rendered":"Code Clones auf Bytecode finden: NiCad im Test"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_beitragsbild_code_clones-1024x683.png\" alt=\"Illustration: Code Clone Detection im digitalen Raum\" class=\"wp-image-2290\" srcset=\"https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_beitragsbild_code_clones-1024x683.png 1024w, https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_beitragsbild_code_clones-300x200.png 300w, https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_beitragsbild_code_clones-768x512.png 768w, https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_beitragsbild_code_clones-1200x800.png 1200w, https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_beitragsbild_code_clones.png 1536w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p><em>Illustration: Code Clone Detection im digitalen Raum<\/em><br><em>Quelle: Bild generiert mit Hilfe von KI (Open AI)<\/em><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Code Clone Detection<\/strong> geh\u00f6rt zu den wichtigsten Tools im Software Engineering, wenn es um <strong>Wartbarkeit<\/strong>, <strong>Qualit\u00e4t<\/strong> und <strong>Kostenkontrolle<\/strong> geht. In nahezu jeder gr\u00f6\u00dferen Codebase entstehen Klone \u2013 durch bewusstes Copy-Paste, Code Reuse, Zeitdruck, fehlende Teamabstimmung oder uneinheitliche Coding Practices.<\/p>\n\n\n\n<p>Das Problem: <strong>Doppelter Code bedeutet doppelte Pflege<\/strong>. Im schlimmsten Fall verbreiten sich Bugs durch Kopien (\u201eBug Propagation\u201c) und machen Fixes aufwendig und fehleranf\u00e4llig.<\/p>\n\n\n\n<p>Typische Einsatzbereiche von Code Clone Detection:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Refactoring &amp; Redundanzanalyse:<\/strong> Wo lohnt sich Konsolidierung?<\/li>\n\n\n\n<li><strong>Plagiatserkennung:<\/strong> z. B. in Ausbildung und Recruiting<\/li>\n\n\n\n<li><strong>Security &amp; Vulnerability Detection:<\/strong> Schwachstellen tauchen oft als Klon an mehreren Stellen auf<\/li>\n\n\n\n<li><strong>Testaufwand reduzieren:<\/strong> \u00e4hnliche Komponenten k\u00f6nnen Testplanung vereinfachen \u2013 teils sogar bei Web-Seiten<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-1 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.dotsource.de\/labs\/code-clones-auf-bytecode-finden-nicad-im-test\/\">Zum Beitrag<\/a><\/div>\n<\/div>\n\n\n\n<!--more-->\n\n\n\n<p><strong>Was sind Code Clones? Die 4 relevanten Klon-Typen<\/strong><\/p>\n\n\n\n<p>Damit Ergebnisse von Clone Detectors vergleichbar werden, unterscheidet man meist vier Klon-Klassen:<\/p>\n\n\n\n<p><strong>Type-1: Exakte Klone<\/strong><\/p>\n\n\n\n<p><strong>100% identischer Code<\/strong> (evtl. nur mit unterschiedlichen Whitespaces\/Kommentaren).<\/p>\n\n\n\n<p><strong>Type-2: Umbenannte Klone<\/strong><\/p>\n\n\n\n<p>Struktur identisch, aber <strong>Variablen-\/Methodennamen wurden ge\u00e4ndert<\/strong>.<\/p>\n\n\n\n<p><strong>Type-3: Near-Miss Klone<\/strong><\/p>\n\n\n\n<p>\u201eFast gleich\u201c: Zeilen wurden <strong>hinzugef\u00fcgt, entfernt oder ge\u00e4ndert<\/strong>.<\/p>\n\n\n\n<p><strong>Type-4: Semantische Klone<\/strong><\/p>\n\n\n\n<p>Andere Syntax, aber <strong>gleiche Funktion\/Logik<\/strong> \u2013 h\u00e4ufig die schwierigsten Klone. Teilweise auch <strong>sprach\u00fcbergreifend<\/strong> m\u00f6glich.<\/p>\n\n\n\n<p>Gerade Type-3\/Type-4 machen Clone Detection anspruchsvoll, weil reine Syntax-\u00c4hnlichkeit nicht reicht.<\/p>\n\n\n\n<p><strong>Der spannende Ansatz: Code Clone Detection auf JVM-Bytecode statt auf Source Code<\/strong><\/p>\n\n\n\n<p>Viele Clone Detection-Verfahren arbeiten direkt auf Quellcode. Eine englische Masterarbeit untersucht jedoch einen alternativen Weg:<\/p>\n\n\n\n<p><strong>K\u00f6nnen Source-Code-Klone erkannt werden, wenn man statt Quellcode JVM-Bytecode (und daraus abgeleitete IR) analysiert?<\/strong><\/p>\n\n\n\n<p>Warum das relevant ist: <strong>Nicht nur Java<\/strong> landet auf der JVM. Auch <strong>Kotlin, Scala oder Clojure<\/strong> werden zu JVM-Bytecode kompiliert. Bytecode kann damit als <strong>gemeinsamer Nenner<\/strong> dienen \u2013 quasi ein \u201eUniversaladapter\u201c f\u00fcr Analysen \u00fcber mehrere Sprachen hinweg.<\/p>\n\n\n\n<p><strong>Setup der Masterarbeit: NiCad, BigCloneBench, Stubber und Jimple<\/strong><\/p>\n\n\n\n<p>Damit das Experiment reproduzierbar und gro\u00df genug ist, nutzt die Arbeit etablierte Tools und Benchmarks.<\/p>\n\n\n\n<p><strong>1) BigCloneBench als Benchmark-Dataset<\/strong><\/p>\n\n\n\n<p>Die Masterarbeit nutzt <strong>BigCloneBench<\/strong>, ein gro\u00dfes Dataset f\u00fcr Clone Detection-Evaluierungen.<\/p>\n\n\n\n<p><strong>2) Kompilieren ohne Dependencies mit Stubber<\/strong><\/p>\n\n\n\n<p>Realistische Java-Projekte sind oft schwer kompilierbar (fehlende Libraries, Build-Probleme). Hier kommt <strong>Stubber<\/strong> ins Spiel:<br>Stubber kann <strong>Java-Bytecode ohne externe Dependencies<\/strong> erzeugen, indem fehlende Teile \u201egestubbt\u201c werden.<\/p>\n\n\n\n<p><strong>3) JVM-Bytecode als Input (.bc)<\/strong><\/p>\n\n\n\n<p>Aus Java-Dateien werden Bytecode-Dateien generiert, die als Eingabe f\u00fcr die n\u00e4chste Pipeline dienen.<\/p>\n\n\n\n<p><strong>4) Jimple Register Code via Soot<\/strong><\/p>\n\n\n\n<p>Zus\u00e4tzlich wird Bytecode \u00fcber das <strong>Soot Framework<\/strong> in <strong>Jimple<\/strong> transformiert. Jimple ist eine Intermediate Representation (IR), die als <strong>typed three-address code<\/strong> einfacher zu lesen und zu analysieren ist als \u201eraw\u201c Bytecode.<\/p>\n\n\n\n<p><strong>5) Clone Detection mit NiCad<\/strong><\/p>\n\n\n\n<p>Als Clone Detector wird <strong>NiCad<\/strong> verwendet. NiCad ist bekannt daf\u00fcr, stark von der <strong>syntaktischen Struktur<\/strong> zu profitieren.<\/p>\n\n\n\n<p><strong>6) Evaluation mit BigCloneEval<\/strong><\/p>\n\n\n\n<p>Die Output-Klone (XML) werden in das Format von <strong>BigCloneEval<\/strong> gebracht und dort ausgewertet \u2013 insbesondere anhand des <strong>Recall<\/strong>.<\/p>\n\n\n\n<p><strong>Ergebnisse: Was bringt Code Clone Detection auf Bytecode-Ebene?<\/strong><\/p>\n\n\n\n<p>Die Ergebnisse zeigen ein klares Bild:<\/p>\n\n\n\n<p><strong>Sehr stark bei Type-1 und Type-2 Clones<\/strong><\/p>\n\n\n\n<p>F\u00fcr <strong>exakte<\/strong> und <strong>umbenannte<\/strong> Klone erzielt der Bytecode-Ansatz einen <strong>sehr guten Recall<\/strong>.<br>Das best\u00e4tigt: <strong>Source-Code-Klone lassen sich \u00fcber JVM-Bytecode zuverl\u00e4ssig erkennen.<\/strong><\/p>\n\n\n\n<p><strong>Semantische Klone: teils besser sichtbar \u2013 aber nicht \u201eBest-in-Class\u201c<\/strong><\/p>\n\n\n\n<p>Spannend: Bei h\u00f6heren NiCad-Threshold-Konfigurationen wurden in der IR (Bytecode\/Jimple) <strong>mehr semantische Klone<\/strong> entdeckt, als NiCad vermutlich direkt auf dem jeweiligen Source-Code gefunden h\u00e4tte.<\/p>\n\n\n\n<p>Gleichzeitig bleibt die Performance bei <strong>Type-3\/Type-4<\/strong> insgesamt <strong>unter<\/strong> spezialisierten Verfahren wie <strong>StoneDetector<\/strong> und <strong>IClones<\/strong>.<\/p>\n\n\n\n<p><strong>Grenzen und Risiken: Wann der Ansatz scheitern kann<\/strong><\/p>\n\n\n\n<p>So viel Potenzial Bytecode-Analyse bietet \u2013 es gibt Grenzen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Obfuscation:<\/strong> Verschleierung kann Bytecode stark ver\u00e4ndern und Clone Detection erschweren.<\/li>\n\n\n\n<li><strong>NiCad ist syntaktisch gepr\u00e4gt:<\/strong> Semantische Klone k\u00f6nnen trotz IR \u00fcbersehen werden.<\/li>\n\n\n\n<li><strong>Tool-Bias:<\/strong> Ergebnisse sind nicht automatisch auf andere Clone Detectors \u00fcbertragbar.<\/li>\n\n\n\n<li><strong>Recall ist nicht alles:<\/strong> In realen Projekten z\u00e4hlen auch Precision, Review-Aufwand und Integration in CI\/CD.<\/li>\n<\/ul>\n\n\n\n<p><strong>Praxis-Mehrwert: Warum JVM-Bytecode Clone Detection f\u00fcr Teams interessant ist<\/strong><\/p>\n\n\n\n<p>Wenn du eine Codebase mit mehreren JVM-Sprachen (Java\/Kotlin\/Scala) betreibst, kann Bytecode-basierte <strong>Code Clone Detection<\/strong> Vorteile bringen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mehr Abdeckung ohne Sprach-spezifische Clone Tools<\/strong><\/li>\n\n\n\n<li><strong>Analyse auch ohne vollst\u00e4ndigen Source-Zugriff<\/strong> (z. B. Android-Apps, Module, Third-Party)<\/li>\n\n\n\n<li><strong>Bessere Vergleichbarkeit<\/strong> \u00fcber heterogene JVM-Projekte hinweg<\/li>\n\n\n\n<li><strong>Solide Ergebnisse<\/strong> f\u00fcr Type-1\/Type-2 \u2013 ideal f\u00fcr Refactoring-Backlogs<\/li>\n<\/ul>\n\n\n\n<p><strong>Fazit: Code Clone Detection auf Bytecode ist machbar \u2013 und oft sinnvoll<\/strong><\/p>\n\n\n\n<p>Die Masterarbeit zeigt: <strong>JVM-Bytecode und Jimple eignen sich als Grundlage, um Source-Code-Klone systematisch zu erkennen.<\/strong> Besonders bei <strong>Type-1 und Type-2<\/strong> liefert der Ansatz starke Resultate. Bei <strong>Type-3 und Type-4<\/strong> ist das Potenzial sichtbar, aber spezialisierte semantische Tools bleiben \u00fcberlegen.<\/p>\n\n\n\n<p>F\u00fcr Teams mit gro\u00dfen JVM-\u00d6kosystemen kann Bytecode-basierte <strong>Code Clone Detection<\/strong> ein strategischer Schritt sein: <strong>mehr Coverage, weniger Sprach-Silos \u2013 und bessere Grundlage f\u00fcr Wartung, Sicherheit und Refactoring.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-2 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.dotsource.de\/labs\/wp-content\/uploads\/sites\/4\/2026\/03\/20260302_ds_labs_ma_code_clones.pdf\">Kostenloser Download der gesamten Masterarbeit<\/a><\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Illustration: Code Clone Detection im digitalen RaumQuelle: Bild generiert mit Hilfe von KI (Open AI) Code Clone Detection geh\u00f6rt zu den wichtigsten Tools im Software Engineering, wenn es um Wartbarkeit, Qualit\u00e4t und Kostenkontrolle geht. In nahezu jeder gr\u00f6\u00dferen Codebase entstehen Klone \u2013 durch bewusstes Copy-Paste, Code Reuse, Zeitdruck, fehlende Teamabstimmung oder uneinheitliche Coding Practices. Das &hellip; <a href=\"https:\/\/www.dotsource.de\/labs\/code-clones-auf-bytecode-finden-nicad-im-test\/\" class=\"more-link\">weiterlesen<span class=\"screen-reader-text\"> &#8222;Code Clones auf Bytecode finden: NiCad im Test&#8220;<\/span><\/a><\/p>\n","protected":false},"author":193,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[231],"tags":[],"class_list":["post-2293","post","type-post","status-publish","format-standard","hentry","category-entwicklung"],"aioseo_notices":[],"acf":[],"_links":{"self":[{"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/posts\/2293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/comments?post=2293"}],"version-history":[{"count":5,"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/posts\/2293\/revisions"}],"predecessor-version":[{"id":2299,"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/posts\/2293\/revisions\/2299"}],"wp:attachment":[{"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/media?parent=2293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/categories?post=2293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dotsource.de\/labs\/wp-json\/wp\/v2\/tags?post=2293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}