Domanda

C'è uno strumento in grado di gestire model checking grande, nel mondo reale, per lo più-C ++, sistemi distribuiti, come KDE?

(KDE è un sistema distribuito, nel senso che usa IPC, anche se in genere tutti i processi sono sulla stessa macchina Sì, tra l'altro, questo è un uso valido del "sistema distribuito" -.. Controllare Wikipedia)

Lo strumento avrebbe bisogno di essere in grado di far fronte ad eventi intraprocess e messaggi tra processi.

(supponiamo che se lo strumento supporta C ++, ma non supporta le altre cose che KDE utilizza come moc, siamo in grado di incidere qualcosa insieme a soluzione che.)

sarò felice di accettare meno generali (per esempio gli analizzatori statici specializzati per la ricerca di specifiche classi di bug) o alternative più generali di analisi statica, al posto di model checker effettivi. Ma io sono interessato solo a strumenti che possono effettivamente progetti manico della dimensione e complessità di KDE.

È stato utile?

Soluzione

Si sta, ovviamente, alla ricerca di uno strumento di analisi statica che possono

  • parse C ++ su scala
  • individuare frammenti di codice di interesse
  • estrarre un modello
  • passa quel modello a un modello checker
  • rapporto che risultato a voi

Un problema rilevante è che ognuno ha un'idea diversa su quale modello vorrebbero controllare. Che da solo probabilmente uccide le possibilità di trovare esattamente quello che vuoi, perché ogni strumento di estrazione modello ha generalmente fatto una scelta su ciò che si vuole catturare come modello, e le possibilità che corrisponda ciò che si vuole con precisione sono IMHO vicino a zero.

Non sei chiare su ciò che specificamente si desidera modello, ma presumo che si desidera trovare la comunicazione primitive e modellare le interazioni dei processi per verificare la presenza di qualcosa di simile situazione di stallo?

I venditori commerciali strumento di analisi statica sembra un posto più logico dove cercare, ma non credo che ci sono, ancora. Coverity sembrerebbe come la migliore scommessa, ma sembra che hanno solo qualche tipo di analisi dinamica per problemi di threading Java.

Questa carta dice di fare questo, ma non ho guardato in ogni particolare: l'analisi della composizione programmi C / C ++ con Verisoft . è legato [PDF] Computer-Assisted Si supponga / Garanzia Ragionamento con Verisoft . Sembra di avere a portata di mano, annotate il codice sorgente per indicare gli elementi di modellazione di interesse. Lo strumento Verifysoft stesso sembra essere di proprietà di Bell Labs ed è probabile difficile da ottenere.

Allo stesso modo questo: Distributed Verification of Multi-filettati C ++ Programmi .

Questo documento fa anche affermazioni interessanti, ma non elabora C ++ a dispetto del titolo: Runtime Model Checking di multithread C / C ++ Programmi .

Mentre tutte le parti di questo sono difficili, un problema che tutti condividiamo è l'analisi C ++ (come esemplificato da la carta precedentemente citato) e trovare i modelli di codice che forniscono le informazioni prima per il modello. È inoltre necessario analizzare lo specifico dialetto del C ++ che si sta utilizzando; la sua non è bello che il compilatori C ++ accettano tutte le lingue diverse. E, come si è osservato, l'elaborazione di grandi codici C ++ è necessario. model checker (spin e amici) sono relativamente facili da trovare.

La nostra DMS Software Reengineering Toolkit prevede l'analisi di uso generale, con personalizzabile pattern matching e l'estrazione infatti, e ha un robusto C ++ Front End che gestisce molti dialetti di C ++ (EDIT Feb 2019: tra cui C ++ 17 in Ansi, GCC e sapori MS). Si potrebbe probabilmente essere configurato per trovare ed estrarre i fatti che corrispondono al modello che ti interessano. Ma non lo fa presente al largo della piattaforma.

DMS con la sua C front end sono stati utilizzati per elaborare estremamente grandi applicazioni C (19.000 unità di compilazione!). L'estremità anteriore C ++ è stato utilizzato in rabbia su una varietà di progetti su larga scala C ++ (EDIT Feb 2019: tra cui su larga scala il refactoring di API attraverso 3000 + unità di compilazione). gen di DMS Attribuitecapacità rale, penso che probabilmente in grado di gestire abbastanza grandi blocchi di codice. YMMV.

Altri suggerimenti

statici analizzatori di codice quando viene utilizzato contro la grande base di codice prima volta di solito producono così tanti avvertimenti e gli avvisi che non sarà in grado di analizzare tutti in lasso di tempo ragionevole. E 'difficile individuare i problemi reali da codice che basta guardare sospetto a uno strumento.

Si può cercare di utilizzare gli strumenti di rilevamento invarianti automatiche come "daikon" che catturano percepito invarianti in fase di esecuzione. È possibile convalidare in seguito, se invarianti scoperti (equivalenza delle variabili "a == b + 1" per esempio) abbiano un senso e quindi inserire permanente afferma nel codice. In questo modo quando invariante è violata come risultato del vostro cambiamento si otterrà un messaggio di avviso che forse si è rotto qualcosa con la modifica. Questo metodo consente di evitare la ristrutturazione o modificare il codice per aggiungere test e schernisce.

Il solito modo di applicare tecniche formali ai grandi sistemi è quello di modularizzare loro e scrivere le specifiche per le interfacce di ciascun modulo. Quindi è possibile verificare in modo indipendente ciascun modulo (durante la verifica di un modulo, si importano le specifiche - ma non il codice - degli altri moduli si chiama). Questo approccio rende la verifica scalabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top