~~NOCACHE~~
~~REVEAL theme=simple&size=1024x800~~
====== Analiza kodu ======
===== Statyczna analiza kodu =====
* **Analiza statyczna kodu** - analiza struktury kodu źródłowego lub kodu skompilowanego bez jego uruchomienia
* może być wdrożona w potok ciągłej integracji, automatyczna weryfikacja jakości kodu
* nie jest w stanie wyeliminować "ręcznej" inspekcji kodu ("code review")
* kompilatory głownie analizują skłądnię ale również posiadają bogate funkcji analizy kodu
* analiza w czasie pisania kodu, //quick fix// - schematy naprawy typowych wad kodu
==== Czego dotyczy analiza statyczna ====
* analiza poprawności składni
* bezpieczeństwo: np. brak obsługi specyficznych danych wejściowych, detekcja backdoors, niebezpieczne i nieaktualne funkcje, wycieki pamięci, przepełnienie bufora, używanie niezainicjowanych zmiennych, SQL Injections, ...
* jakość i styl kodu: zgodność z dobrymi praktykami, zachowanie jednolitej konwencji nazewniczej w projekcie/organizacji, detekcja powtórzeń i nieużywanych fragmentów kodu
* wydajność: sugestie zmian kodu w celu podniesienia szybkości działania
==== SDL for Agile ====
Microsoft Security Development Lifecycle
{{:zajecia:npr_2015_1:microsoft-static.png?800|}}
Practice #10: Perform Static Analysis \\ Analiza statyczna w każdym sprincie
Źródło: http://www.microsoft.com/security/sdl/discover/sdlagile.aspx
==== Metody analizy ====
* **analiza leksykograficzna** - wyszukiwanie niebezpiecznych konstrukcji w kodzie źródłowym, zazwyczaj na podstawie zestawu reguł, różnych heurystyk i dopasowania do wzorców błędów
* **metryki kodu źródłowego** - ocena jakości kodu źródłowego na podstawie danych statystycznych
* **metody formalne** - oparte na matematycznej definicji zachowania programu
* modele matematyczne
* reguły logiczne [[wp>Hoare_logic]]
* analiza przepływu [[wp>Data-flow_analysis]]
==== Cechy ====
* Szybkość działania - szybkie wykrywanie błędów, których naprawa jest prosta i mało kosztowna
* nie wymagają uruchamiania programu
* łatwe do zrównoleglenia
* Łatwość użycia - proste we wdrożeniu w cykl wytwarzania oprogramowania
* Automatyzacja - integracja z narzędziami //continius integrations//, serwery automatyzacji, IDE, kontrola wersji
* Możliwości rozszerzania: własne reguły, wtyczki, ...
* Dużo darmowych narzędzi
==== Wady ====
* Wymagany dostęp do źródeł
* Reguły wykrywają zazwyczaj proste błędy i **nie są w stanie wyeliminować ręcznego sprawdzenia kodu**
* Dużo szumu, zbyt czułe - duże prawdopodobieństwo zaklasyfikowanie poprawnego fragmentu jako błędu (//false positive//)
* Każde narzędzie zazwyczaj pokrywa pewien zakres testów. Dlatego warto korzystać z kilku różnych skanerów kodu.
==== Dlaczego analizować kod? ====
Koszt naprawy błędu rosną im potniej błąd zostanie wykryty
{{zajecia:npr:benefits.jpg}}
Źródło: http://www.microsoft.com/security/sdl/about/benefits.aspx
==== ====
* zwiększenie wydajności i stabilności poprzez zasady oparte na dobrych praktykach,
* unikniecie typowych błędów podczas programowania,
* dostarczenie struktury do zarządzania standardami kodu.
* wymuszenie zasad i standardów pisania kodu
* zwiększanie bezpieczeństwa poprzez kolejny etap testowania
* analizując sygnalizowane błędy można się sporo nauczyć na temat dobrych praktyk bezpiecznego programowania
==== Narzędzia ====
[[http://www.unix.com/man-page/FreeBSD/1/lint|Lint]] - UNIX V7 1979, historyczny program od którego nazwy często określa się narzędzia do analizy i szukania błedów
* C/C%%++%%: [[http://cppcheck.sourceforge.net/|cppcheck]], clint, [[http://www.splint.org/|splint]], [[http://clang-analyzer.llvm.org/|clang]], [[http://frama-c.com/|frama-c]]
* PHP: [[https://github.com/oliverklee/pixy|pixy]], [[http://www.program-transformation.org/PHP/PhpSat|php-sat]]
* Java: [[http://findbugs.sourceforge.net/|FindBugs]], [[http://sourceforge.net/projects/jlint/|jlint]], PMD, Checkstyle
* Python: [[http://pylint.org/|pylint]]
* dotNet: FxCop, StyleCop, CAT.NET, Resharper
* JavaScript: [[http://www.jslint.com/|jslint]]
* HTML: [[http://tidy.sourceforge.net/|tidy]] ([[http://infohound.net/tidy/|wersja online]]) , [[http://validator.w3.org/|W3C Validator]]
* CSS: [[http://jigsaw.w3.org/css-validator/|W3C CSS Validator]] , [[http://csslint.net/csslint]]
==== Wielojęzykowe ====
* [[http://code.google.com/p/rough-auditing-tool-for-security/|rats]] (rough auditing tool for security) C, C%%++%%, Perl, PHP, Python
* [[http://pmd.sourceforge.net/|PMD]] Java, JavaScript, XML, XSL (zawiera CPD analiza powtórzeń: C, C%%++%%, C#, PHP, Ruby, Fortran)
* [[http://www.scovetta.com/yasca.html|Yasca]] Java, C/C%%++%%, HTML, JavaScript, ASP, ColdFusion, PHP, COBOL, .NET, and other languages + integracja z innymi SAT
* [[http://sourceforge.net/projects/visualcodegrepp/|VisualCodeGrepper]] C/C%%++%%, C#, VB, PHP, Java and PL/SQL
* Wiele innych: [[wp>List_of_tools_for_static_code_analysis|Liata narzędzi na Wikipedii]], [[http://samate.nist.gov/index.php/Source_Code_Security_Analyzers.html|Source Code Security Analyzers]]
==== Ograniczenia ====
* Jest wiele typów błędów, które ciężko jest wykryć, np. błędy związane są z konfiguracją lub logiką modelowanego problemu
* Problemem są zależności, dodatkowe moduły, biblioteki, konteksty dodawane przez frameworki
* Skomplikowane algorytmy i architektury bardzo ciężko jest analizować
// calculate the number of days
int days = hours / 23;
==== Więcej informacji ====
* [[http://sekurak.pl/statyczna-analiza-bezpieczenstwa-kodu-aplikacji-czesc-1-wprowadzenie/|Statyczna analiza bezpieczeństwa kodu aplikacji]]
* [[http://security.psnc.pl/files/szkolenia/KDM_101116.pdf|Statyczna analiza kodu źródłowego]] by Tomasz Nowak
===== Analiza kodu w Visual Studio =====
==== Zmiany w kolejnych wersjach ====
* VS 2013 - program FxCop \\ dedykowane okno z wynikami analizy
* VS 2015, 2017 - FxCop \\ wyniki analizy w oknie Error List
* VS 2019 - kompilator .NET + pakiety analizatorów
* **Build -> Run Code Analysis** \\ **Analyze -> Run Code Analysis**
{{zajecia:znd_2020_1:menu_analiza.png?600|}}
==== ====
| VS 2013 \\ {{zajecia:znd_2014_1:fxcop_window.png?300|}} | VS 2015, 2017, 2019\\ {{zajecia:znd_2020_1:diagnostics-severities-in-error-list.png?600}} |
==== Analiza VS 2019 ====
* kompilator .NET Compiler Platform ("Roslyn")
* dodatkowe analizatory w pakietach NuGet:
* **FxCopAnalyzers** \\ rekomendowany przez MS zestaw analizatorów\\ [[http://msdn.microsoft.com/en-us/library/ms229042%28v=vs.110%29.aspx|.NET Framework Design Guidelines]]
* **StyleCopAnalyzer** \\ analizator stylu, uzupełnia reguły FxCop
* inne rozszerzenia, np.: Resharper
* analiza kodu w czasie pisania kodu w edytorze
* //Quick Action// - sugestie naprawy kodu
* czyszczenie kodu
==== Quick action ====
* sugestie naprawy błędu, czasem kilka do wyboru
* np. naprawa błędów składni (literówki), usuwanie nieużywanych zmiennych, transformacje kodu do innej postaci
* {{https://docs.microsoft.com/pl-pl/visualstudio/ide/common-quick-actions?view=vs-2019|typowe szybkie akcje naprawy}}
{{zajecia:znd_2020_1:built-in-analyzer-code-fix.png?800}}
==== Poziom defektu ====
| **Error** (czerwony) \\ **Warning** (zielony) \\ **Info** (szary) \\ Hidden \\ None \\ Default | |{{zajecia:znd_2020_1:diagnostics-severity-colors.png?500}} \\ {{zajecia:znd_2020_1:diagnostics-severities-in-error-list.png?500}}|
==== Konfiguracja stylu ====
* ustawienia edytora tekstu **Tools -> Options -> Text Editor**
{{zajecia:znd_2020_1:code-style-quick-actions-dialog.png?800}}
==== Plik konfiguracyjny ====
* ''.editorconfig'' ustawienia analizy stylu w postaci pliku tekstowego
* obecny w strukturze projektu nadpisuje domyślne ustawienia w zakresie folderu
|{{zajecia:znd_2020_1:generate-editorconfig-file-small.png?500}}| {{zajecia:znd_2020_1:editconfig.png?500}}|
==== Czyszczenie kodu ====
* automatyczne czyszczenie kodu w całym projekcie
* tylko defekty, które nie niosą ryzyka uszkodzenia kodu
{{zajecia:znd_2020_1:run-code-cleanup-project-solution.png?800}}
==== ====
* można konfigurować własne profile wybierając reguły, które mają być zaaplikowane
{{zajecia:znd_2020_1:configure-code-cleanup.png?600}}
==== Analizatory w pakietach NuGet ====
* [[https://github.com/dotnet/roslyn-analyzers|Microsoft.CodeAnalysis.FxCopAnalyzers]]
* [[https://github.com/DotNetAnalyzers/StyleCopAnalyzers|StyleCop.Analyzers]]
* reguły spełniają wytyczne: [[http://msdn.microsoft.com/en-us/library/ms229042%28v=vs.110%29.aspx|.NET Framework Design Guidelines]]
{{zajecia:znd_2020_1:nuget_fxcop2.png?800}}
==== Analizator FxCop ====
* analizator C# działa na skompilowanym kodzie
* ponad 200 defektów: aktualna [[https://github.com/dotnet/roslyn-analyzers/blob/master/src/Microsoft.CodeAnalysis.FxCopAnalyzers/Microsoft.CodeAnalysis.FxCopAnalyzers.md|lista reguł]]
* konwencja nazewnicza (//Naming//)
* konstrukcje kodu (//Designe//)
* użycie, przepływ danych (//Usage//)
* lokalizacja (//Globalization//)
* wydajność (//Performance//)
* czytelność kodu (//Reliability//)
* bezpieczeństwo (//Security//)
* utrzymanie kodu (//Maintainability//)
* przykład: [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/ca1051?view=vs-2019|CA1051: Do not declare visible instance fields]]
==== Analizator StyleCop ====
* analizator kodu C#, działa na kodzie źródłowym
* aktualna [[https://dotnetanalyzers.github.io/StyleCopAnalyzers/|lista reguł]]
* zasady robienia wcięć (//SpecialRules//),
* poprawianie czytelności kodu (//ReadabilityRules//),
* ujednolicanie kolejności elementów kodu (//OrderingRules//),
* konwencje nazewnicze (//NamingRules//),
* zasady dotyczące dokumentowania kodu (//DocumentationRules//), ...
* przykład: [[https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1119.md|SA1119]] Nadmiarowe nawiasy
int x = (5 + b);
==== Konfiguracja ====
* analizatory są dostępne w zasobach projektu
|{{zajecia:znd_2020_1:analyzers-expanded-in-solution-explorer.png?600}}|{{zajecia:znd_2020_1:analyzer-diagnostic-properties.png}}|
==== Konfiguracja poziomu ostrzeżeń ====
* zmiana poziomu ważności dla reguł możliwa jest z menu szybkiej akcji oraz z poziomu listy błędów
|{{zajecia:znd_2020_1:configure-rule-severity-suggestion.png?600}}|{{zajecia:znd_2020_1:konfiguracja_z_error_list.png?600}}|
==== Zastawy reguł ====
* można tworzyć własne zestawy reguł (//rule set//) \\ **Solution Explorer -> Analyzers -> Open Active Rule Set**
* po zapisaniu zmian w projekcie pojawi się plik ''ruleset'' z naszymi ustawieniami
|{{zajecia:znd_2020_1:open_rule_set.png}}| {{zajecia:znd_2020_1:rule_set_window.png}}|
==== Wyłączanie ostrzeżeń ====
* ustawienie ważności ''serverity = None'' wyłącza ostrzeżenia danego typu
* **Suppress -> In Source**: w kodzie, w miejscu w którym występuje podatność \\ ''#pragma warning disable CA1234''
* **Suppress -> In Supression File**: w dodatkowym pliku określającym wyłączone reguły dla projektu porpzez atrybut ''SuppressMessage()''
{{zajecia:znd_2020_1:suppress-diagnostic-from-editor.png}}
==== Metryki kodu ====
* Statystyki oceniające złożoność kodu oraz skalę trudności jego utrzymania i rozwoju
* **Analyse -> Calculate Code Metrics**
* **[[https://docs.microsoft.com/pl-pl/archive/blogs/codeanalysis/maintainability-index-range-and-meaning|Maintainability Index]]** - utrzymywalność kodu, wartość w zakresie 0-100, uwzględnia złożoność struktury kodu i ilość operacji w stosunku do liczby linii\\ 20-100 good , 10-19 moderately, 0-9 low
{{zajecia:znd_2020_1:code_metrics.png?800}}
==== ====
* **Cyclomatic Complexity** - złożoność struktury kodu określona ilością różnych ścieżek wykonania. Program z dużą liczbą ścieżek wymaga wielu testów do pokrycia kodu i jest trudniejszy w utrzymaniu
* **Depth of Inheritance** - głębokość dziedziczenia. Im wyższa wartość tym większe ryzyko, że zmiana w klasie bazowej uszkodzą działanie klas potomnych.
* **Class Coupling** - uwikłanie klas, ilość unikatowych obiektów od których zależy badany fragment kodu (np. wartości zwracane, wywołania funkcji). Duża wartość wskazuje trudności z ponownym wykorzystaniem kodu, jego rozwijaniem oraz utrzymaniem
* **Lines of Source Code** ilość linii kodu
* **Lines of Executable code** - przybliżona ilość instrukcji wykonywalnych (VS2019)
==== ====
* Ostrzeżenia analizatora FxCop związane z metrykami (domyślnie wyłączone)
* [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/ca1501?view=vs-2019|CA1501: Avoid excessive inheritance]]
* [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/ca1502?view=vs-2019|CA1502: Avoid excessive complexity]]
* [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/ca1505?view=vs-2019|CA1505: Avoid unmaintainable code]]
* [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/ca1506?view=vs-2019|CA1506: Avoid excessive class coupling]]
==== Więcej informacji ====
* [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/?view=vs-2019|Analiza kodu w programie Visual Studio]] dokumentacja Visual Studio
* [[https://programmer-girl.com/2019/08/04/stylecop-fxcop/|StyleCop i FxCop – statyczna analiza kodu]] by Weronika Mularczyk
* [[https://blog.submain.com/stylecop-detailed-guide/|StyleCop: A Detailed Guide to Starting and Using It]] by Peter Morlion
* [[http://sekurak.pl/statyczna-analiza-bezpieczenstwa-kodu-aplikacji-czesc-3-fxcop/|Statyczna analiza bezpieczeństwa kodu aplikacji — FxCop]] by Adrian “Vizzdoom” Michalczyk
* Wikipedia: [[wp>FxCop]], [[wp>StyleCop]]