JavaRush /Java Blog /Random-IT /Pausa caffè #94. Revisione di cinque analizzatori di codi...

Pausa caffè #94. Revisione di cinque analizzatori di codice Java statici. Errori di memoria heap e stack Java

Pubblicato nel gruppo Random-IT

Revisione di cinque analizzatori di codice Java statici

Fonte: DZone Gli sviluppatori spesso necessitano di vari programmi, inclusi analizzatori di codice statici, in grado di trovare e correggere codice errato nelle prime fasi dello sviluppo. Sebbene le revisioni del codice siano uno strumento prezioso in questo sforzo, a volte la quantità di revisori del codice che devono revisionare e rivedere è scoraggiante. Ciò richiede molto tempo e impegno. Ciò porta anche al fatto che i revisori spesso prestano attenzione solo ai frammenti di codice critici per il funzionamento del programma. Mentre gli strumenti di analisi statica controllano tutto il codice con la stessa precisione. Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 1Ho messo insieme diversi analizzatori di codice compatibili con IntelliJ IDEA. Spero che questo ti aiuti nel tuo lavoro.

Analizzatore IntelliJ IDEA integrato

L'analizzatore di codice Java statico integrato in IntelliJ IDEA non è in alcun modo inferiore agli strumenti di analisi statica specializzati. La ricerca di frammenti di codice sospetti, confusi o errati viene effettuata utilizzando diversi metodi di analisi statica: analisi del flusso di dati e pattern match. IntelliJ IDEA ha un gran numero di ispezioni. In verità, molti di essi non sempre riportano accuratamente l’errore. Piuttosto, indicano una negligenza nel codice o la possibilità di modificarlo con un’alternativa interessante. Dopo aver studiato un po' “Ispezioni → Java”, ho notato una cosa. Le ispezioni nelle categorie di errori probabili, problemi numerici e problemi di serializzazione hanno maggiori probabilità di individuare errori reali. In ogni caso, devi condurre tu stesso i test e determinare quali saranno utili per il tuo progetto. Poiché l'analisi statica viene eseguita in modalità di modifica del codice, in IntelliJ IDEA puoi correggere gli errori entro pochi secondi dal loro verificarsi. L'editor evidenzia immediatamente il frammento di codice errato. Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 2È davvero comodo e fantastico! Inoltre, se utilizzi la combinazione “Alt + Invio” su un pezzo di codice selezionato, puoi selezionare una delle opzioni per correggere l'errore tramite il menu contestuale: Puoi anche scoprire il motivo per cui è stata eseguita una determinata ispezione Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 3. In alcuni casi, ciò riduce i tempi di ricerca: Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 4è possibile eseguire l'analisi manualmente selezionando "Analizza → Controlla codice". Oppure puoi eseguire un controllo individuale utilizzando "Analizza → Esegui controllo per nome". Prima di fare ciò, specificare l'ambito di analisi (per un progetto, un modulo o un singolo file). Quando si esegue un'analisi in questo modo, diventano disponibili alcune ispezioni che non funzionano in modalità di modifica a causa della complessità. Dopo l'analisi, i risultati verranno raggruppati per categoria/directory in una finestra separata. Da questa finestra è possibile accedere a un trigger di convalida specifico: Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 5IntelliJ consente solo di salvare il risultato dell'analisi nei formati HTML e XML. Sfortunatamente, a mio avviso, è più conveniente lavorare con i problemi rilevati nell'IDE stesso. Nota. La maggior parte delle funzionalità dell'analizzatore statico sono disponibili nella versione gratuita IntelliJ IDEA Community Edition.

SonarJava

SonarJava è un analizzatore di codice statico per Java di SonarSource. L'elenco delle sue funzioni include:
  • Oltre 150 regole di rilevamento degli errori;
  • Oltre 350 regole per riconoscere gli odori dei codici;
  • Oltre 40 regole per rilevare potenziali vulnerabilità ;
  • Integrazione con Maven, Gradle, Ant, Eclipse, IntelliJ IDEA, VS Code;
  • Espandibile con regole diagnostiche personalizzate;
  • Strumento SAST specializzato: la maggior parte delle regole diagnostiche sono compilate in conformità con CWE , CERT , OWASP .
È possibile eseguire l'analisi sia in vari IDE (tramite il plugin SonarLint ) sia separatamente in SonarQube . SonarLint può funzionare fianco a fianco con l'analizzatore di codice IntelliJ IDEA integrato. Se passi il mouse su una parte di codice evidenziata, spesso puoi vedere gli avvisi di entrambi gli analizzatori: Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 6ovviamente puoi visualizzare l'avviso in una finestra separata: Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 7nel complesso, la possibilità di eseguire SonarJava in modi diversi lo rende attraente. Ciò offre agli sviluppatori la libertà di scegliere uno strumento durante la scrittura del codice.

TrovaBugs/SpotBugs

Purtroppo FindBugs non viene aggiornato da molto tempo; l’ultima versione stabile è stata rilasciata nel 2015. Ma lo ricordiamo e lo usiamo ancora, poiché è forse il più famoso analizzatore di codice Java statico gratuito. Se chiedi a uno sviluppatore Java informazioni sull'analisi statica, probabilmente penseranno immediatamente a FindBugs. L'analizzatore open source SpotBugs è diventato una continuazione logica dell'abbandonato FindBugs. Ha tutti i vantaggi e gli svantaggi di FindBugs. Il tempo dirà se questo è un bene o un male. Nel frattempo, la comunità degli analizzatori lo sta sviluppando attivamente. Caratteristiche principali di SpotBugs:
  • Oltre 400 regole di rilevamento degli errori;
  • Integrazione in Ant, Maven, Gradle, Eclipse, IntelliJ IDEA;
  • Espandibile con regole diagnostiche personalizzate.
Per individuare il codice sospetto vengono utilizzate le stesse metodologie: pattern match e analisi del flusso di dati. L'analizzatore rileva vari tipi di errori correlati al multithreading, alle prestazioni, alle vulnerabilità, all'offuscamento del codice e così via. In IntelliJ IDEA, la finestra di avviso è simile alla seguente: Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 8Gli avvisi possono essere raggruppati per categoria, classe, directory e livello di confidenza. È possibile visualizzare contemporaneamente avvisi e documentazione per qualsiasi regola diagnostica. L'analisi viene avviata manualmente. Dopo l'analisi, tutti i frammenti di codice problematici vengono evidenziati insieme ad altri avvisi di IntelliJ IDEA e SonarLint. Tuttavia, c'è un problema. È necessario eseguire nuovamente l'analisi per aggiornare gli avvisi in modo che riflettano le modifiche apportate al file. Sono inoltre presenti numerosi avvisi di avviso, pertanto l'analizzatore deve essere configurato prima dell'uso attivo.

PVS-Studio

PVS-Studio si basa sulla libreria open source Spoon. Prende il codice sorgente come input e crea un modello AST ben progettato con informazioni semantiche. Sulla base di questo modello, l'analizzatore utilizza tecniche moderne come:
  • Analisi del flusso di dati;
  • Performance simbolica;
  • Annotazioni sul metodo;
  • Analisi basata su modelli.
Attualmente, l'analizzatore utilizza più di 105 regole diagnostiche che identificano vari difetti del codice. Questi includono correzioni di errori di battitura, ridenominazione di riferimenti null, codice irraggiungibile, indice di array fuori limite, violazione dell'utilizzo del contratto del metodo e altri errori. Puoi scoprire tutte le funzionalità delle regole diagnostiche qui . Principali funzioni di PVS-Studio:
  • L'analizzatore si concentra sulla ricerca di errori reali;
  • Oltre alla versione CLI è presente anche l'integrazione con IntelliJ IDEA, Maven, Gradle, Jenkins, SonarQube;
  • Possibilità di eseguire l'analizzatore in modalità incrementale;
  • L'analizzatore identifica potenziali problemi di compatibilità con l'API Java SE durante la migrazione di un progetto da Java 8 a versioni più recenti;
  • PVS-Studio converte il report in vari formati intuitivi: JSON, XML, HTML, TXT;
  • Strumento SAST specializzato: la maggior parte delle regole diagnostiche sono compilate in conformità con CWE , CERT , OWASP .

PMD

PMD è un analizzatore statico open source. Identifica gli errori comuni di sviluppo: variabili inutilizzate, blocchi vuoti, creazione di oggetti non necessari e altri problemi. L'analizzatore utilizza il codice sorgente come input. Attualmente, PMD analizza un file sorgente per processo, il che impone limitazioni alla completezza dell'analisi. Gli autori del PMD consigliano di assemblare il progetto prima dell'analisi. Ciò consente di estrarre informazioni sui tipi utilizzati nel codice analizzato. Principali funzioni del PMD:
  • Integrazione con vari IDE (IntelliJ IDEA, Eclipse, NetBeans) e sistemi di build (Maven, Gradle, Ant);
  • Supporta vari formati di report dell'analizzatore: SARIF, CSV, IDEA, JSON, testo (predefinito), XML, HTML, TextColor e così via;
  • Dispone di più di 300 modelli di regole diagnostiche. Categorie: stile di codifica, best practice, bug, multithreading, prestazioni e così via;
  • Fornisce un CPD (rilevatore copia-incolla) insieme a un PMD che rileva i duplicati nel codice.
Se esaminiamo tutte le regole diagnostiche, il PMD è più concentrato sulla risoluzione dei problemi di stile di codifica e sull'individuazione degli errori evidenti. Le regole diagnostiche potrebbero entrare in conflitto tra loro, pertanto devono essere configurate prima di utilizzare l'analizzatore. Puoi anche eseguire l'analisi tramite un plug-in per IntelliJ IDEA, ma non puoi selezionare singoli file per l'analisi. La finestra di avviso si presenta così: Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 9A mio avviso, lavorare con gli avvisi non è molto conveniente, poiché non possono essere raggruppati per file e messaggi non ovvi. Appaiono solo quando passi il mouse sopra l'avviso.

Conclusione

Naturalmente, oltre agli analizzatori discussi sopra, esistono altre soluzioni. Esistono sia programmi a pagamento (Coverity, Klockwork, JArchitect) che gratuiti (Error Prone, Infer, Checkstyle). Si concentrano tutti su una cosa: impedire che codice errato o potenzialmente difettoso raggiunga la produzione. Non ho il diritto di giudicare quale analizzatore sia più adatto a questo compito. Ma gli analizzatori che sviluppano analisi del flusso di dati ed esecuzione simbolica hanno maggiori probabilità di trovare un vero bug nel codice. Se scegli un analizzatore statico presta attenzione a:
  • integrazione in vari IDE;
  • integrazione nei sistemi di assemblaggio;
  • facilità di avvio dell'analizzatore sul server;
  • la capacità di rilevare errori nella modalità di modifica del codice;
  • la capacità di lavorare comodamente con gli avvisi;
  • Orientamento SAST;
  • percentuale di falsi positivi;
  • complessità della configurazione.
  • La combinazione di tutti i pro e i contro ti porterà al numero di analizzatori statici che consideri i migliori.
Nota: ho fornito esempi di integrazione in IntelliJ IDEA, poiché lo uso spesso.

Errori di memoria heap e stack Java

Fonte: DZone Vediamo ora i principali errori che possono verificarsi nella memoria heap o stack di Java, ma prima ricordiamo cosa significano questi due termini.
  • La memoria heap è un'area speciale della memoria in cui vengono archiviati gli oggetti Java.
  • La memoria dello stack è un'area di memoria temporanea per la memorizzazione di variabili quando si chiama un metodo.
L'eccezione principale che descrive un problema di memoria heap è java.lang.OutOfMemoryError . Pausa caffè #94.  Revisione di cinque analizzatori di codice Java statici.  Errori di memoria heap e stack Java - 10

Spazio heap Java

Questo errore si verifica quando un programma Java non riesce ad allocare un nuovo oggetto in un'area di memoria heap.

Limite di sovraccarico GC superato

Un programma Java impiega troppo tempo nella raccolta dei rifiuti. Questo errore viene visualizzato quando la garbage collection occupa il 98% del tempo del programma e recupera meno del 2% dello spazio di memoria.
public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        int i = 0;
        List<String> stringList = new ArrayList<>();
        while (i < Integer.MAX_VALUE) {
            i++;
            String generatedString = new String( "Some string generated to show out of memory error example " + i);
            stringList.add(generatedString);
        }
    }
}
Qui stringList contiene un riferimento alle nostre stringhe generate, quindi il garbage collector non può rimuovere le stringhe generate dalla memoria, ma tenta di rimuovere qualsiasi altra spazzatura nell'applicazione. Ma questo non basta.

La dimensione dell'array richiesta supera il limite della VM

L'errore si verifica quando si tenta di allocare un array quando non c'è abbastanza spazio nell'heap.
public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        // we try to create too long array
        long[] array = new long[Integer.MAX_VALUE];
    }
}

Metaspazio

Viene generata un'eccezione con questo messaggio quando non c'è spazio nella regione del metaspazio per le informazioni sui dati della classe.

Nessuno spazio di swap (richiedi dimensione byte per motivo. Spazio di swap esaurito?)

L'errore viene visualizzato quando non è possibile allocare la memoria sull'heap nativo o la sua dimensione è insufficiente.

motivo stack_trace_with_native_method

Un'interfaccia Java nativa o un metodo nativo non sono riusciti ad allocare memoria nell'heap. StackOverFlowError : quando sono presenti troppe chiamate al metodo. Di solito viene lanciata un'eccezione da un metodo che contiene la ricorsione al suo interno.
public class StackOverFlowErrorDemo {

    public static void main(String[] args) {
        recursiveMethod(2);
    }

    public static int recursiveMethod(int i) {
      	// it will never stop and it allocates all stack memory
        return recursiveMethod(i);
    }
}
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION