Jaka jest różnica między analizą kodu statycznego a przeglądem kodu?

9

Chciałem tylko wiedzieć, jaka jest różnica między statyczną analizą kodu a przeglądem kodu. Jak się robi każdy z tych dwóch? Mówiąc dokładniej, jakie narzędzia są obecnie dostępne do przeglądania kodu / analizy statycznej PHP? Chciałbym również wiedzieć o dobrych narzędziach do sprawdzania kodu w dowolnym języku.

Thomas Owens
źródło
Przegląd kodu jest zazwyczaj procesem ręcznym, w którym inny programista sprawdza Twój kod. Jest to sposób na wykrycie drobnych błędów lub odchyleń od konwencji kodowania itp. Oraz dobry sposób na poprawę ogólnej jakości kodu. Narzędzie do analizy kodu statycznego jest czymś, do czego możesz użyć narzędzia, chociaż sam nigdy tego nie zrobiłem.
9
W dwóch słowach? "Mózg".
MSalters

Odpowiedzi:

19

Przegląd kodu to coś, co robią ludzie, analiza statyczna to coś, co robią maszyny. Istnieją (czasem dobre) narzędzia analizy statycznej. Przegląd kodu ma miejsce, gdy kolega / mentor / profesor / przyjaciel omija Twój kod i daje ci konstruktywną krytykę.

Z drugiej strony, analiza statyczna jest zautomatyzowanym procesem, w którym maszyna, poinformowana przez to, co wie o języku, który analizuje (zwykle z systemu typów), analizuje program i próbuje wykryć rzeczy, które mogą być niepoprawne, nieefektywny, zły styl lub w inny sposób nieoptymalny.

Rafe Kettler
źródło
2
Zawsze miałem wrażenie, że przegląd kodu jest rodzajem analizy statycznej, ponieważ jest to sposób mierzenia stanu oprogramowania bez jego wykonywania.
Buhb
4
@Buhb: znacznie zwiększa znajomość kontekstu. Kontroler kodu powinien zrozumieć, czy kod działa zgodnie z oczekiwaniami. Narzędzie statyczne (w najlepszym przypadku, jeśli język na to pozwala poprzez dekorację / asercję / kontrakt), sprawdza, czy formalnie wszystko jest w porządku ... Można więc powiedzieć inaczej: analiza statyczna jest rodzajem przeglądu kodu, wykonywanego algorytmicznie.
Francesco
Wystarczy dodać, Lint (analityk statyczny): Koleś, który nie jest potrzebny !! Kolega (recenzent): Ty też możesz to zrobić !!
Kushal
11

Analiza statyczna to proces analizy oprogramowania bez jego wykonywania. Jest to bardzo dobre i zalecane, ale musisz o tym pamiętać

  1. różne narzędzia analizy statycznej różnie rozumieją badany kod, stąd mogą sygnalizować (lub nie sygnalizować) różne problemy. Jedno narzędzie może dać czysty raport, a drugie może narzekać na milion rzeczy.
  2. narzędzie dynamiczne (aby wymienić przykład, pomyśl o valgrind) może znaleźć wiele innych problemów, kosztem poważnego obciążenia zasobów (czas, zużycie pamięci). Wynika to z faktu, że zazwyczaj używasz oprzyrządowanej wersji oprogramowania. Zauważ, że będąc w pewien sposób instrumentowanym (zamień swój malloc na malloc debugujący), nie jest on dokładnie identyczny z twoim oprogramowaniem (jak widać z czasów wykonania)

Oba te podejścia cierpią na brak kontekstu: nie wiedzą, co ma osiągnąć sw.

Przegląd kodu jest wykonywany przez innego programistę, który podobno go zna i może sprawdzić

  1. jeśli kod jest poprawny
  2. jeśli oprogramowanie jest poprawne semantycznie.

Jest znacznie droższy i ma różny stopień powtarzalności, ale jest świetną pomocą.

Jak zawsze nie ma jednej srebrnej kuli, która naprawiłaby wszystkie błędy i uniknęła wszystkich problemów. Zaleca się stosowanie - o ile to możliwe, biorąc pod uwagę miejsce, kod, czas, trzy formy kontroli (statyczne, dynamiczne, więcej oczu (i mózgów) faktycznie spoglądających na kod).

ps: Muszę zauważyć, że zwykle o wiele lepiej jest zastosować narzędzia od zera. Konwersja starszego systemu jest znacznie mniej przyjemnym doświadczeniem z powodu fałszywych wyników pozytywnych. Jeśli zaczniesz od zera i zawsze dążysz do utrzymania narzędzia do analizy w czystości, prawdopodobnie unikniesz wielu problemów.

pps: jeśli chodzi o narzędzia, zależy to od języka. W świecie C i C ++ możesz zacząć od samego Visual Studio, które zawiera wbudowane narzędzie do analizy statycznej. Stosunkowo kompletną listę można znaleźć na Wikipedii.

ppps: Analiza statyczna jest bardziej odpowiednia dla języków statycznych, takich jak C lub C ++. Pythonowi może być naprawdę trudno powiedzieć, czy nazwa odnosząca się do listy w pewnym momencie będzie odnosić się do listy dla reszty programu, ze względu na jego właściwości dynamiczne. Nie oznacza to, że nic nie da się zrobić, jak pokazuje JIT, jak pokazuje PyPy .

Francesco
źródło
2

Przegląd kodu ma miejsce, gdy starszy lub dedykowany organ sprawdza kod, sposób kodowania, standardy przestrzegane w kodzie, a w szczególności poziom logiczny kodu

Jeśli chodzi o analizę statyczną, to analiza oprogramowania komputerowego jest przeprowadzana bez wykonywania programów zbudowanych z tego oprogramowania (analiza wykonywana na programach jest znana jako analiza dynamiczna)

Lista narzędzi według technologii znajduje się w poniższym linku

Lista narzędzi do analizy statycznej

Dlatego przegląd kodu i analiza statyczna to zupełnie inne terminy.

OM Wieczność
źródło
7
Odpowiedź OM jest zasadniczo poprawna, z tym wyjątkiem, że sprzeczam się z: „Starszy lub Specjalny Organ sprawdza kod ...”. To prawda, że ​​niektóre dysfunkcyjne sklepy przeprowadzają przeglądy kodu w ten sposób nadrzędny / podrzędny, wiele sklepów (i lepszych) ma system recenzji kodu peer-to-peer, który nie przypomina nauczyciela oceniającego zadanie domowe. Tam, gdzie pracuję, równie często jest tak, że młodszy recenzent pracy seniora. Celem jest, aby druga para oczu spojrzała na cały kod, zanim zostanie sprawdzony.
Jim In Texas
2
@JimInTexas, to samo w naszym sklepie. Powiedziałbym, że najważniejszym (długoterminowym) wynikiem przeglądów kodu jest rozpowszechnianie wiedzy, ujednolicanie praktyk oraz wizja architektury / projektowania w zespole. Pod tym względem młodszy recenzent kodu seniora jest w najgorszym świetnym sposobem na poznanie lokalnych najlepszych praktyk - ale kto twierdzi, że starszy nigdy nie popełnia błędów, a młodszy nigdy go nie dostrzega?
Péter Török
1

Przegląd kodu jest bardziej oceną jakościową, statyczna analiza kodu jest bardziej oceną ilościową.

Hej, chłopcze, tę metodę można napisać lepiej

vs, fe

Zmniejszona wydajność. Identyfikacja pustego ciągu przy użyciu konstrukcji „wcslen (str)> 0” jest nieefektywna. Bardziej efektywnym sposobem jest sprawdzenie: str [0]! = '\ 0'.

Zmniejszona wydajność. Wyrażenie rodzaju strlen (MyStr.c_str ()) można przepisać jako MyStr.length ()

Zmniejszona wydajność. W przypadku, gdy „Kolejność” jest iteratorem, bardziej efektywne jest użycie prefiksu w postaci przyrostu. Zamień iterator ++ na iterator ++.

Chociaż rzeczywiste błędy mogą (oczywiście) istnieć i zostać wykryte przez SCA

Niepoprawny format. Rozważ sprawdzenie rzeczywistego argumentu funkcji „Foo”

Wyrażenie zostało zamknięte nawiasami dwukrotnie: ((wyrażenie)). Jedna para nawiasów jest niepotrzebna lub występuje błąd w drukowaniu

Wywołanie funkcji „memset” spowoduje niedopełnienie bufora „dest.lfFaceName”

Leniwy Borsuk
źródło
przepraszam, że cię obrażam. Jeśli chodzi o to, co miał powiedzieć mój (zniknął?) Komentarz - czy znasz jakiś powód, dla którego człowiek nie może zaoferować tych samych komentarzy, które podajesz jako przykłady danych wyjściowych z analizy kodu statycznego?
sq33G
@ sq33G: Nie. Każda osoba z materiałami biurowymi (praktycznie nieskończona ilość papieru) może symulować dowolną maszynę Turinga. Jest to jednak nudne i czasochłonne. (Być może nie ten, który podaje, ale mówią niezdefiniowane zachowania w C).
Maciej Piechotka,
Ach Tak więc prawdziwą odpowiedzią na pytanie PO jest to, że maszyny Turinga nie są kompletne dla ludzi.
sq33G
0

Analiza statyczna ma miejsce, gdy artefakt jest analizowany bez wykonywania. Chociaż można go zastosować do dowolnego artefaktu, często stosuje się go do kodu źródłowego lub kodu obiektowego i odnosi się do użycia określonych narzędzi do analizy i uzyskiwania informacji o tych produktach roboczych. Narzędzia te generują raporty, które są interpretowane przez inżyniera do wykorzystania przy określaniu jakości budowanego systemu oraz jako przewodnik przy planowaniu rozwoju i konserwacji. Wikipedia ma listę narzędzi do analizy statycznej , uporządkowanych według języka i z krótkim opisem ich możliwości.

Recenzje są ludzką oceną pewnego produktu roboczego, którym może być kod. Przeglądy można również przeprowadzać również na projektach lub innych dokumentach. Chodzi o to, że osoby zaznajomione z produktem roboczym innym niż programista patrzą na niego w celu znalezienia błędów, od problemów bezpieczeństwa po naruszenia standardu kodowania.

Z technicznego punktu widzenia przegląd kodu można uznać za formę analizy statycznej, ponieważ kod nie jest w rzeczywistości wykonywany podczas przeglądu. Jednak w powszechnej terminologii „analiza statyczna” zazwyczaj odnosi się do parsowania maszynowego plików źródłowych lub obiektowych, podczas gdy „przegląd” wskazuje, że to ludzie przeprowadzają analizę.

Thomas Owens
źródło
-2

Przegląd kodu to przydatna technika wyczuwania problemów w kodzie źródłowym na bardzo wczesnym etapie. W ramach tego ćwiczenia zidentyfikowano i naprawiono wiele problemów, takich jak wydajność, skalowalność i standardy kodowania. Poprawi to jakość kodu.

Analiza statyczna służy do analizy wskaźników jakości kodu, takich jak złożoność cyklometryczna, wskaźnik łatwości konserwacji, głębokość dziedziczenia i sprzężenia klas. Różne narzędzia dostępne na rynku do analizy jakości kodu. Deweloper C # używa Microsoft Visual Studio do generowania raportów metrycznych.

Balasubramanian.S
źródło
-3

statyczna analiza kodu jest wykonywana przez zautomatyzowane narzędzie, przegląd kodu jest przeprowadzany z ludźmi przed zatwierdzeniem kodu.

Narzędzia do przeglądu kodu:

1. porównanie porównania

2. różnica oprogramowania do kontroli wersji

Te narzędzia są zawsze używane do generowania różnicy między starą wersją a nową wersją.

upton
źródło
2
1) Nie musi to nastąpić przed zatwierdzeniem kodu - przegląd kodu jest wykonywany przez ludzi i 2) Uważam, że opis narzędzi różnicowych jest „interesujący”, ponieważ są to narzędzia służące do identyfikacji kodu do przeglądu, ale jeśli Zapytano mnie o narzędzia do sprawdzania kodu, które prawdopodobnie wskazałbym na te, które pomagają zarządzać procesem (na przykład użyłem Kiln i Crucible).
Murph