ErrorProne.NET – partea I
ErrorProne.NET – partea I
De ceva timp m-am tot gandit sa dezvolt un analizator care sa ma ajute sa identific diferite erori, specifice mai mult sau mai putin platformei .Net. Multe din aceste erori sunt deja usor de indentificat de catre R# dar orice programator vrea sa isi dezvolte propriile solutii nu? Plus ca analizatorii Roslyn sunt perfect integrati in procesul de construire si pot sa contina reguli specifice softwareului pe care il produci.
22 Apr 2016
2504
Other articles
Object-relational Mapping folosind JPA, Hibernate si Spring Data JPA. Persistence cu JPA
Cum sa interogam Kafka Streaming Data?
Procrastinarea. Care sunt avantajele ei?
Object-relational Mapping folosind JPA, Hibernate si Spring Data JPA
Procrastinarea
Cerinte. De ce avem nevoie de ele?
Dezvolta-ti abilitatile cu training-urile noastre
Programarea reactiva Java. Implementari
Testarea software. Intrebari tipice si raspunsuri. Continuare
Testarea software. Intrebari tipice si raspunsuri
De ceva timp m-am tot gandit sa dezvolt un analizator care sa ma ajute sa identific diferite erori, specifice mai mult sau mai putin platformei .Net. Multe din aceste erori sunt deja usor de indentificat de catre R# dar orice programator vrea sa isi dezvolte propriile solutii nu? Plus ca analizatorii Roslyn sunt perfect integrati in procesul de construire si pot sa contina reguli specifice softwareului pe care il produci.
Asa ca am pornit la lucru pe baza ideilor din R# si dintr-o librarie similara pentru Java dezvoltata de Google – Error Prone. Mai jos sunt rezultatele muncii mele.
Apelarea metodelor pure
Lipsa “observarii” rezultatelor apelarii metodei pure este una dintre cele mai comune greseli care are loc in timpul testarii locale. Problema este ca printr-o simpla citire a codului este foarte dificil sa spunem in avans daca apelarea someCollection.Union(anotherCollection) este “pura” si returneaza o noua colectie sau o schimba pe cea originala.
Iata cateva exemple ale acestei reguli:

Aceasta regula ia in considerare cateva tipuri cunoscute a BCL (Base Class Library), care sunt garantat imuabile sau contin doar metode “pure”. Mai mult ia in considerare si atributul PureAttribute, pe care il poti folosi pentru a marca orice metoda. Am adaugat si cateva euristici: toate tipurile cu prefixul Immutable sunt considerate imuabile, toate metodele cu prefixul With care returneaza tipul primului argument, precum si metodele imuabile de extensie care sunt pure. Existe anumite rezultate fals pozitive pentru aceasta regula, dar nu atat de multe, si rezultatele pozitive justifica solutia.
Din pacate, nu este inca clar cum sa folosim adnotarile de puritate din libraria Code Contracts si trebuie sa ne gandim si cat de scalabila vom face solutia. Dar chiar si acum, aceasta regula a gasit destule bug-uri minore in codul proiectului meu (toate au fost in teste si in codul secundar, dar totusi).
Crearea obiectelor fara salvarea valorilor
Un caz special al regulei anterioare este o regula care cauta un object constructor call al tipului new SomeObject(), fara a utiliza rezultatul.
Din pacate nu este posibil sa apara avertismente catre orice standing alone new call, deoarece utilizatorii fac uneori lucruri teribile sub forma unor operatiuni cu efecte secundare in constructori. Dar in anumite cazuri s-ar putea sa fie corect sa spui ca un constructor nu are efecte secundare. Acest lucru se refera la apelarea constructorilor pentru default value types, collections, objects sau primitive immutable types.

Exista si un caz special a acestei reguli care genereaza o eroare atunci cand dezvoltam un exception object:

String Formatting
Un alt tip popular de eroare este un argument gresit cand apelam string.Format si alte metode similare. Chiar daca frecventa folosirii metodelor string.Format a scazut cu aparitia string interpolation in C# 6.0, este inca destul cod legacy si format strings sunt utilizate frecvent in alte locuri.
ErrorProne.NET contine trei reguli:
Argumente necunoscute:

Argumente redundante:

Format string invalide:

De asemenea este si o regula separata care valideaza modelul de expresie regulata:

Regulile iau in considerare atributul JetBrains.Annotations.StringFormatMethodAttribute, care poate fi obtinut prin NuGet sau creat in codul tau.
-----------------
(*) Da stiu despre existenta ReSharper Command Line Tools.
Concluzie
Sunt constient ca sunt foarte multe instrumente pe piata; este greu sa concurezi cu R# sau analizatori ca PVS-Studio si ca atare nu mi-am stabilit un asemenea obiectiv. Dar este o activitate interesanta si as vrea sa adun intr-un singur loc toti analizatorii utili.
Doar o parte din regulile ErrorProne.Net sunt discutate aici asa ca vor mai urma niste articole.
Referinte
Asa ca am pornit la lucru pe baza ideilor din R# si dintr-o librarie similara pentru Java dezvoltata de Google – Error Prone. Mai jos sunt rezultatele muncii mele.
Apelarea metodelor pure
Lipsa “observarii” rezultatelor apelarii metodei pure este una dintre cele mai comune greseli care are loc in timpul testarii locale. Problema este ca printr-o simpla citire a codului este foarte dificil sa spunem in avans daca apelarea someCollection.Union(anotherCollection) este “pura” si returneaza o noua colectie sau o schimba pe cea originala.
Iata cateva exemple ale acestei reguli:

Aceasta regula ia in considerare cateva tipuri cunoscute a BCL (Base Class Library), care sunt garantat imuabile sau contin doar metode “pure”. Mai mult ia in considerare si atributul PureAttribute, pe care il poti folosi pentru a marca orice metoda. Am adaugat si cateva euristici: toate tipurile cu prefixul Immutable sunt considerate imuabile, toate metodele cu prefixul With care returneaza tipul primului argument, precum si metodele imuabile de extensie care sunt pure. Existe anumite rezultate fals pozitive pentru aceasta regula, dar nu atat de multe, si rezultatele pozitive justifica solutia.
Din pacate, nu este inca clar cum sa folosim adnotarile de puritate din libraria Code Contracts si trebuie sa ne gandim si cat de scalabila vom face solutia. Dar chiar si acum, aceasta regula a gasit destule bug-uri minore in codul proiectului meu (toate au fost in teste si in codul secundar, dar totusi).
Crearea obiectelor fara salvarea valorilor
Un caz special al regulei anterioare este o regula care cauta un object constructor call al tipului new SomeObject(), fara a utiliza rezultatul.
Din pacate nu este posibil sa apara avertismente catre orice standing alone new call, deoarece utilizatorii fac uneori lucruri teribile sub forma unor operatiuni cu efecte secundare in constructori. Dar in anumite cazuri s-ar putea sa fie corect sa spui ca un constructor nu are efecte secundare. Acest lucru se refera la apelarea constructorilor pentru default value types, collections, objects sau primitive immutable types.

Exista si un caz special a acestei reguli care genereaza o eroare atunci cand dezvoltam un exception object:

String Formatting
Un alt tip popular de eroare este un argument gresit cand apelam string.Format si alte metode similare. Chiar daca frecventa folosirii metodelor string.Format a scazut cu aparitia string interpolation in C# 6.0, este inca destul cod legacy si format strings sunt utilizate frecvent in alte locuri.
ErrorProne.NET contine trei reguli:
- Argumente necunoscute in format string
- Argumente redundante care nu sunt folosite
- Format string invalide
Argumente necunoscute:

Argumente redundante:

Format string invalide:

De asemenea este si o regula separata care valideaza modelul de expresie regulata:

Regulile iau in considerare atributul JetBrains.Annotations.StringFormatMethodAttribute, care poate fi obtinut prin NuGet sau creat in codul tau.
-----------------
(*) Da stiu despre existenta ReSharper Command Line Tools.
Concluzie
Sunt constient ca sunt foarte multe instrumente pe piata; este greu sa concurezi cu R# sau analizatori ca PVS-Studio si ca atare nu mi-am stabilit un asemenea obiectiv. Dar este o activitate interesanta si as vrea sa adun intr-un singur loc toti analizatorii utili.
Doar o parte din regulile ErrorProne.Net sunt discutate aici asa ca vor mai urma niste articole.
Referinte
- ErrorProne.NET pe GitHub
- SolutionDiagnosticRunner pe GitHub – Il folosesc pentru a rula analizatorii din linia de comanda pentru analiza a diferite proiecte inclusiv proiectul Roslyn
- ErrorProne.NET pe Visual Studio Gallery
- ErrorProne.NET pe NuGet.org
Sergey Teplyakov
Expert in .Net, С++ and Application Architecture