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.

Apr 22, 2016 1974
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:

ErrorProne1.jpg

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.

ErrorProne2.jpg

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

ErrorProne3.jpg

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
Problemele din al doilea bullet nu se intampla in cadrul executiei si nu duc la generarea de exceptii FormatException dar acest lucru poate sa ascunda greseli si s-ar putea ca aceste lucruri sa se intample in practica si mai des decat restul optiunilor. Aceasta este regula care m-a ajutat sa gasesc un bug evident in codul Roslyn. Iata ticketul daca sunteti interesati.

Argumente necunoscute:

ErrorProne4.jpg

Argumente redundante:

ErrorProne5.jpg

Format string invalide:

ErrorProne6.jpg

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

ErrorProne7.jpg

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

Sergey Teplyakov
Expert in .Net, С++ and Application Architecture

Daca iti place acest articol, distribuie-l si prietenilor tai!




Mai ai intrebari?
Contacteaza-ne.
Thank you.
Your request has been received.