Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ~~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: <wrap lo> 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, ...</wrap> * jakość i styl kodu: <wrap lo>zgodność z dobrymi praktykami, zachowanie jednolitej konwencji nazewniczej w projekcie/organizacji, detekcja powtórzeń i nieużywanych fragmentów kodu </wrap> * wydajność: <wrap lo>sugestie zmian kodu w celu podniesienia szybkości działania </wrap> ==== 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 <wrap lo>Źródło: http://www.microsoft.com/security/sdl/discover/sdlagile.aspx</wrap> ==== 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}} <wrap lo>Źródło: http://www.microsoft.com/security/sdl/about/benefits.aspx</wrap> ==== ==== * 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ć <code C> // calculate the number of days int days = hours / 23; </code> ==== 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 \\ <wrap lo>dedykowane okno z wynikami analizy</wrap> * VS 2015, 2017 - FxCop \\ <wrap lo> wyniki analizy w oknie Error List</wrap> * VS 2019 - kompilator .NET + pakiety analizatorów * <wrap lo>**Build -> Run Code Analysis**</wrap> \\ <wrap lo>**Analyze -> Run Code Analysis**</wrap> {{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 <wrap lo>**Tools -> Options -> Text Editor**</wrap> {{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: <wrap lo> [[https://docs.microsoft.com/pl-pl/visualstudio/code-quality/ca1051?view=vs-2019|CA1051: Do not declare visible instance fields]]</wrap> ==== 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 <code C#>int x = (5 + b);</code> ==== 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//) \\ <wrap lo>**Solution Explorer -> Analyzers -> Open Active Rule Set**</wrap> * 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 <wrap lo> ''serverity = None''</wrap> wyłącza ostrzeżenia danego typu * **Suppress -> In Source**: w kodzie, w miejscu w którym występuje podatność \\ <wrap lo>''#pragma warning disable CA1234''</wrap> * **Suppress -> In Supression File**: w dodatkowym pliku określającym wyłączone reguły dla projektu porpzez atrybut <wrap lo> ''SuppressMessage()''</wrap> {{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\\ <wrap lo>20-100 <wrap green>good </wrap>, 10-19 <wrap yellow>moderately</wrap>, 0-9 <wrap red>low</wrap></wrap> {{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]]