
Inserisce e rileva watermark basati su stile e chiave nel codice Python, Java e C++ generato da LLM tramite riscrittura del CST, preservando la correttezza funzionale e resistendo agli attacchi di modifica del codice.
| Caratteristica | Watermark a livello di token (KGW, SWEET, Unigram, STONE, STA-1) | Watermark post-hoc (ACW, SrcMarker, RoSeMary) | ✨ SEW |
|---|---|---|---|
| Accesso | Al momento della decodifica (influenza la selezione dei token) | Post-hoc (riscrive il codice finito) | Post-hoc (riscrive il codice finito, indipendente dal modello) |
| Correttezza funzionale | Modifica il programma (compromesso rilevabilità–correttezza) | Può rompere i programmi (pass@1 Java/C++ ≈ 12% con riscrittura neurale) | Preservata (pass@1 uguale al codice non watermarked) |
| Prevedibilità | — | Pattern ricorrenti (recuperati da 10 programmi watermarked) | Dipendente da chiave e contesto (le scelte variano con la struttura di ogni programma) |
| Rilevamento (TPR@FPR5%) | 14–60% | 31–98% | ⚡ 98,7–99,5% |
Il watermarking del codice generato da LLM supporta il tracciamento della provenienza. I watermark che modificano la selezione dei token durante la generazione scambiano la rilevabilità con la correttezza funzionale e richiedono il controllo sul modello generatore. I metodi post-hoc invece applicano un watermark al codice completato con trasformazioni predefinite o modelli neurali addestrati, ma i loro pattern ricorrenti rendono il watermark prevedibile tra i programmi, e i pattern già comuni nel codice non watermarked vengono conteggiati come prova del watermark, causando falsi rilevamenti. SEW si chiede: lo stile del codice di un programma già generato può portare un watermark corretto per costruzione, difficile da prevedere e calibrato rispetto al codice scritto da esseri umani?
SEW (Style-Encoded Watermarking) incorpora e rileva watermark in codice già generato attraverso tre componenti:
x += 1 / x = x + 1, range(n) / range(0, n), if (c) s; / if (c) { s; }) vengono confrontate sull'albero della sintassi concreta (CST). Quale variante assume un sito è deciso da una chiave segreta e dal contesto strutturale del sito.Il rilevamento necessita solo del codice sospetto e della chiave — non del modello generatore, del codice originale o di qualsiasi registro dell'incorporamento.
✅ Indipendente dal modello e corretto per costruzione — SEW riscrive solo i siti di stile in cui entrambe le varianti hanno la stessa semantica, quindi funziona sull'output di qualsiasi modello e mantiene il pass@1 uguale a quello del codice non watermarked.
✅ Evidenza calibrata — Un test di Poisson-binomiale con probabilità di stile stimate dal codice scritto da esseri umani (soluzioni LeetCode, disgiunte dai dati di valutazione) mantiene bassi i falsi rilevamenti sul codice umano.
✅ Robusto e difficile da inferire — SEW mantiene il suo rilevamento sotto formattazione, linting, rimozione dei commenti e rinomina delle variabili, e un avversario che osserva programmi watermarked non può recuperare le sue scelte di stile come recupera quelle delle baseline post-hoc.
Risultato principale — rilevamento su CodeContests (TPR@FPR5% / AUROC, %), mediato su tre LLM (Qwen3.5-9B, gemma-4-12B-it, gpt-oss-20b).
| Tipo | Metodo | Python | Java | C++ |
|---|---|---|---|---|
| A livello di token | KGW | 48,33 / 80,56 | 43,30 / 72,31 | 59,31 / 84,54 |
| SWEET | 59,92 / 85,18 | 41,19 / 76,56 | 60,01 / 87,24 | |
| Unigram | 57,45 / 88,97 | 36,54 / 71,37 | 47,05 / 71,13 | |
| STONE | 28,09 / 62,33 | 14,38 / 62,95 | 23,65 / 64,79 | |
| STA-1 | 35,26 / 66,26 | 20,93 / 61,48 | 44,71 / 73,72 | |
| Post-hoc | ACW | 90,10 / 95,05 | – | – |
| SrcMarker | 90,21 / 97,86 | 71,52 / 93,58 | 69,88 / 81,55 | |
| RoSeMary | 97,86 / 97,32 | 31,00 / 95,46 | 81,26 / 89,44 | |
| SEW | 99,49 / 99,64 | 98,70 / 98,99 | 99,22 / 99,38 |
Correttezza funzionale (pass@1 del codice watermarked, %; codice non watermarked: 57,63 / 52,05 / 53,74).
| Metodo | Python | Java | C++ |
|---|---|---|---|
| ACW | 56,00 | – | – |
| SrcMarker | 56,78 | 11,87 | 11,82 |
| RoSeMary | 56,39 | 11,71 | 11,52 |
| SEW | 57,63 | 52,05 | 53,74 |
Robustezza agli attacchi di modifica del codice (TPR@FPR5%, %, mediato su tre LLM e tre linguaggi; ACW: solo Python).
| Metodo | Nessun attacco | Formattazione | Linting | Rimozione commenti | Rinomina |
|---|---|---|---|---|---|
| KGW | 50,31 | 43,31 | 49,99 | 24,48 | 43,26 |
| SWEET | 53,71 | 49,79 | 53,00 | 19,34 | 48,83 |
| ACW | 90,10 | 0,51 | 93,56 | 89,35 | 3,17 |
| SrcMarker | 77,20 | 77,23 | 76,42 | 77,20 | 26,43 |
| RoSeMary | 70,04 | 67,00 | 69,42 | 70,04 | 22,26 |
| SEW | 99,14 | 95,57 | 98,99 | 99,14 | 99,14 |