{"id":91065,"date":"2020-08-08T01:42:18","date_gmt":"2020-08-07T23:42:18","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii"},"modified":"2020-08-08T01:42:18","modified_gmt":"2020-08-07T23:42:18","slug":"staticheskij-analiz-ot-znakomstva-do-integraczii","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii","title":{"rendered":"Static analysis \u2013 from introduction to integration","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tired of endless code reviews or debugging, you sometimes wonder how to make your life easier. With a bit of searching, or perhaps by chance, you might come across the magical phrase: \"Static Analysis\". Let\u2019s explore what it is and how it can interact with your project.<\/p>\n<p><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/7811b22510bdda6f3f774b8335cbeabe.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nActually, if you're programming in any modern language, you've unknowingly been passing your code through a static analyzer. The thing is, every modern compiler provides at least a few warnings about potential issues in the code. For example, when compiling C++ code in Visual Studio, you might see the following:<\/p>\n<p><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/a267e4e8a57c1a32e508e5e1983c5ff0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn this output, we can see that the variable <i>var<\/i> was never used anywhere in the function. So in fact, you\u2019ve almost always been using a simple static code analyzer. However, unlike professional analyzers like Coverity, Klocwork, or PVS-Studio, the warnings provided by the compiler can only indicate a small range of problems.<\/p>\n<p>If you're not sure what static analysis is and how to implement it, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/t\/0046\/\">read this article<\/a><\/noindex>, to get a more detailed understanding of this methodology. <\/p>\n<h2>Why is static analysis needed?<\/h2>\n<p>\nIn short: to speed things up and simplify them. <\/p>\n<p>Static analysis can uncover a variety of problems in the code, from incorrect use of language constructs to typographical errors. For example, instead of <\/p>\n<pre><code class=\"cpp\">auto x = obj.x;\nauto y = obj.y;\nauto z = obj.z;<\/code><\/pre>\n<p>\nyou wrote the following code:<\/p>\n<pre><code class=\"cpp\">auto x = obj.x;\nauto y = obj.y;\nauto z = obj.x;<\/code><\/pre>\n<p>\nAs you can see, there\u2019s a typo in the last line. For example, PVS-Studio gives the following warning:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/w\/v537\/\">V537<\/a><\/noindex> Consider reviewing the correctness of 'y' item's usage.<\/p>\n<p>If you want to poke at this error hands-on, try the ready-made example on Compiler Explorer: *<noindex><a rel=\"nofollow\" href=\"https:\/\/godbolt.org\/z\/cd4WK7\">click<\/a><\/noindex>*.<\/p>\n<p>As you can imagine, it\u2019s not always possible to pay attention to such snippets of code right away, which can lead to spending a good hour debugging, wondering why everything works so strangely. <\/p>\n<p>However, this is a clear error. And what if a developer wrote suboptimal code because they forgot some nuance of the language? Or even introduced <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/t\/0066\/\">undefined behavior<\/a><\/noindex>? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u044b\u0434\u0435\u043d\u043d\u044b \u0438 \u043b\u044c\u0432\u0438\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 undefined behavior.<\/p>\n<p>Static analysis has emerged specifically for these situations. It serves as a developer's assistant, pointing out various issues in the code and explaining in the documentation why certain coding practices should be avoided, what consequences they may lead to, and how to fix them. Here's an example of what it may look like: *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/w\/v702\/\">click<\/a><\/noindex>*.<\/p>\n<p>You can find more interesting errors that the analyzer can detect in the following articles:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0700\/\">Top 10 C++ Project Mistakes of 2019<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0698\/\">Top 10 C# Project Mistakes of 2019<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0699\/\">Top 10 Java Project Mistakes of 2019<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNow that you've read this material and understood the benefits of static analysis, you might want to try it out. But where to start? How to integrate a new tool into your current project? And how to introduce it to the team? You'll find answers to these questions below.<\/p>\n<p><b>Note.<\/b> Static analysis does not replace or negate the usefulness of code reviews. It complements this process by helping to catch and correct typos, inaccuracies, and risky constructs early on. It's much more productive to focus code reviews on algorithms and code clarity rather than on spotting misplaced brackets or <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0509\/\">reading tedious comparison functions.<\/a><\/noindex>.<\/p>\n<h2>0. Getting Familiar with the Tool<\/h2>\n<p>\nIt all starts with a trial version. Indeed, it's difficult to commit to implementing anything in the development process if you've never seen the tool in action. Therefore, the first step is to download the <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/pvs-studio-download\/?promo=mscas\">trial version.<\/a><\/noindex>.<\/p>\n<p><b>What you'll learn at this stage:<\/b><\/p>\n<ul>\n<li>What interaction methods are available with the analyzer;<\/li>\n<li>Whether the analyzer is compatible with your development environment;<\/li>\n<li>What problems currently exist in your projects.<\/li>\n<\/ul>\n<p>\nOnce you've installed everything necessary, the first thing to do is run an analysis of the entire project (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0635\/\">Windows<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">Linux<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">macOS<\/a><\/noindex>). In the case of PVS-Studio in Visual Studio, you'll see something like this (clickable):<\/p>\n<p><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/865b2dfa10661e4999238cdccf8860dc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThe thing is that static analyzers usually generate a massive number of warnings for large codebase projects. There's no need to fix them all since your project is already working, meaning these issues are not critical. However, you <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0633\/\">can take a look at the most interesting warnings.<\/a><\/noindex> and correct them as necessary. This requires filtering the output and retaining only the most reliable messages. In the PVS-Studio plugin for Visual Studio, this is done by filtering based on error levels and categories. For the most accurate output, keep only those enabled. <i>High<\/i> and <i>General<\/i> (also clickable):<\/p>\n<p><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/400b90713f67b531e4ed513ea9d340a6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIndeed, reviewing 178 warnings is significantly easier than sifting through a few thousand...<\/p>\n<p>In the tabs <i>Medium<\/i> and <i>Low<\/i> there are often good warnings, however, these categories include diagnostics that have lower accuracy (reliability). You can find more about warning levels and options for Windows operation here: *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0007\">click<\/a><\/noindex>*.<\/p>\n<p>After successfully reviewing the most interesting errors (and fixing them successfully), it's worth <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0032\/\">suppressing the remaining warnings<\/a><\/noindex>. This is necessary so that new warnings do not get lost among the old ones. Additionally, the static analyzer is a helper for the programmer, not a bug list. \ud83d\ude42<\/p>\n<h2>1. Automation<\/h2>\n<p>\nOnce familiarization is complete, it's time to configure plugins and integration into CI. This needs to be done before programmers begin using the static analyzer. The reason is that programmers might forget to enable the analysis or may not wish to use it at all. Therefore, a final check of everything must be done to ensure that unverified code cannot enter the main development branch.<\/p>\n<p><b>What you will learn at this stage:<\/b><\/p>\n<ul>\n<li>What automation options the tool provides;<\/li>\n<li>Whether the analyzer is compatible with your build system.<\/li>\n<\/ul>\n<p>\nSince ideal documentation doesn't exist, sometimes you have to write to <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/about-feedback\/\">support<\/a><\/noindex>. This is normal, and we're happy to help you. \ud83d\ude42<\/p>\n<p>Now, let's move on to continuous integration (CI) services. Any analyzer can be integrated into them without any serious issues. This requires creating a separate stage in the pipeline, usually following the build and unit tests. This is done using various console utilities. For example, PVS-Studio provides the following utilities:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0035\">PVS-Studio_Cmd.exe<\/a><\/noindex> (solution analysis for C#, C++ projects on Windows)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0031\/\">CLMonitor.exe<\/a><\/noindex> (compilation monitoring)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">pvs-studio-analyzer<\/a><\/noindex> (C++ project analysis on Linux \/ macOS)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0035\/\">pvs-studio-dotnet<\/a><\/noindex> (solution analysis for C# projects on Linux \/ macOS)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0044\/\">pvs-studio.jar<\/a><\/noindex> (Java project analysis)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0038\/\">PlogConverter<\/a><\/noindex> (report file converter)<\/li>\n<\/ul>\n<p>\nTo integrate analysis into CI, you need to do three things:<\/p>\n<ul>\n<li>Install the analyzer;<\/li>\n<li>Run the analysis;<\/li>\n<li>Deliver the results.<\/li>\n<\/ul>\n<p>\nFor example, to install PVS-Studio on Linux (Debian-based), you need to execute the following commands:<\/p>\n<pre><code class=\"bash\">wget -q -O - https:\/\/files.viva64.com\/etc\/pubkey.txt \n    | sudo apt-key add -\nsudo wget -O \/etc\/apt\/sources.list.d\/viva64.list \n  https:\/\/files.viva64.com\/etc\/viva64.list\n  \nsudo apt-get update -qq\nsudo apt-get install -qq pvs-studio<\/code><\/pre>\n<p>\nOn Windows systems, there is no way to install the analyzer from a package manager; however, it is possible to launch the analyzer from the command line:<\/p>\n<pre><code class=\"powershell\">PVS-Studio_setup.exe \/verysilent \/suppressmsgboxes \n\/norestart \/nocloseapplications<\/code><\/pre>\n<p>\nRead more about deploying PVS-Studio on Windows systems *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0025\/\">here<\/a><\/noindex>*.<\/p>\n<p>After installation, you need to start the analysis itself. However, it is recommended to do this only after the compilation and tests are complete. This is because static analysis typically requires twice as much time as compilation.<\/p>\n<p>Since the way of launching depends on the platform and project specifics, I will show an option for C++ (Linux) as an example:<\/p>\n<pre><code class=\"bash\">pvs-studio-analyzer analyze -j8 \n                            -o PVS-Studio.log\nplog-converter -t errorfile PVS-Studio.log --cerr -w<\/code><\/pre>\n<p>\nThe first command will perform the analysis, and the second <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0038\/\">converts<\/a><\/noindex>the report to text format, outputs it to the screen, and returns a non-zero exit code in case of warnings. This mechanism is convenient for blocking the build in case of error messages. However, you can always remove the flag <i>-w<\/i> and not block the build containing warnings.<\/p>\n<p><b>Note.<\/b> Text format is inconvenient. It is provided just as an example. Note the more interesting report format \u2014 FullHtml. It allows for navigation through the code.<\/p>\n<p>You can read more about configuring analysis in CI in the article \"<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0005\">PVS-Studio and Continuous Integration<\/a><\/noindex>\" (Windows) or \"<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0661\/\">How to set up PVS-Studio in Travis CI<\/a><\/noindex>\" (Linux).<\/p>\n<p>Alright, you've set up the analyzer on the build server. Now, if someone pushes unverified code, the verification stage will fail, and you\u2019ll be able to detect the issue. However, this is not entirely convenient, as it\u2019s more effective to check the project not after the branches merge, but before, at the pull request stage.<\/p>\n<p>Overall, setting up analysis for pull requests is not much different from running analysis in CI. Except for the need to get a list of changed files. Typically, this can be done by requesting the difference between branches using git:<\/p>\n<pre><code class=\"bash\">git diff --name-only HEAD origin\/$MERGE_BASE &gt; .pvs-pr.list<\/code><\/pre>\n<p>\nNow, you need to pass this list of files to the analyzer. For example, in PVS-Studio, this is implemented using a flag. <i>-S<\/i>:<\/p>\n<pre><code class=\"bash\">pvs-studio-analyzer analyze -j8 \n                            -o PVS-Studio.log \n                            -S .pvs-pr.list<\/code><\/pre>\n<p>\nYou can learn more about analyzing pull requests *<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0679\/\">here<\/a><\/noindex>*. Even if your CI isn't on the list of services mentioned in the article, you will find the general section dedicated to the theory of this type of analysis useful.<\/p>\n<p>By configuring analysis for pull requests, you can block commits containing warnings, thereby creating a boundary that unverified code cannot cross.<\/p>\n<p>This is certainly good, but it would be nice to have the ability to see all warnings in one place. Not only from the static analyzer but also from unit tests or the dynamic analyzer. For this, there are various services and plugins. For example, PVS-Studio has <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0037\/\">a plugin for integration with SonarQube.<\/a><\/noindex>.<\/p>\n<h2>2. Integration on developers' machines<\/h2>\n<p>\nNow it\u2019s time to install and configure the analyzer for everyday use during development. By this point, you should be familiar with most of the ways to work, so this can be considered the easiest part.<\/p>\n<p>As the simplest option, developers can install the required analyzer themselves. However, this will take a lot of time and distract them from development, so you can automate this process using installers and necessary flags. For PVS-Studio, there are various <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0025\/\">flags for automated installation.<\/a><\/noindex>. However, there are always package managers, such as Chocolatey (Windows), Homebrew (macOS), or dozens of options for Linux.<\/p>\n<p>Then, you'll need to install the required plugins, for instance, for <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0635\/\">Visual Studio.<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/plugins.jetbrains.com\/plugin\/12263-pvs-studio-for-idea-and-android-studio\/\">IDEA.<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0052\/\">Rider.<\/a><\/noindex> etc.<\/p>\n<h2>3. Daily use<\/h2>\n<p>\nAt this stage, it's time to say a few words about ways to speed up the analyzer's work during daily use. A full analysis of the entire project takes a lot of time, but how often do we change the code all at once across the entire project? It's unlikely there exists a large-scale refactor that affects the whole codebase at once. The number of files changed at once rarely exceeds ten, so it makes sense to analyze them. For such a situation, there is <noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0024\/\">an incremental analysis mode.<\/a><\/noindex>Just don't be alarmed, this isn't just another tool. It's a special mode that allows you to analyze only the modified files and their dependencies, and this happens automatically after a build when you're working in an IDE with the installed plugin. <\/p>\n<p>If the analyzer detects issues in the recently modified code, it will notify you on its own. For instance, PVS-Studio will alert you using a notification:<\/p>\n<p><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/20456a6652f0bd4f62d9aea5f1dda5cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIt's not enough to just tell developers to use the tool. You need to explain what it is and how it works. For example, here are articles about getting started quickly with PVS-Studio, but similar tutorials can be found for any tool you prefer:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0007\/\">How to run PVS-Studio on Windows (C, C++, C#)<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0036\/\">How to run PVS-Studio on Linux and macOS (C, C++)<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/m\/0044\/\">How to run PVS-Studio Java<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nSuch articles provide all the necessary information for everyday use and do not take much time. \ud83d\ude42<\/p>\n<p>During the initial familiarization with the tool, we suppressed many warnings during one of the first runs. Unfortunately, static analyzers are not perfect and sometimes trigger false positives. It's usually easy to suppress them; for example, in the PVS-Studio plugin for Visual Studio, you just need to press one button:<\/p>\n<p><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/ed5382f468d21b7e711caba73b439fda.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHowever, you can do more than just suppress them. For example, you can report the issue to support. If a false positive can be fixed, then in future updates you may notice that the number of issues specific to your codebase decreases with every iteration.<\/p>\n<h2>After integration<\/h2>\n<p>\nWe've now gone through all the stages of integrating static analysis into the development process. Despite the importance of configuring such tools in CI, the most crucial place to run them is actually the developer's computer. After all, a static analyzer isn't a judge, who far removed from you says that the code is not good enough. On the contrary, it\u2019s an assistant that reminds you if you're fatigued and prompts you if you've forgotten something.<\/p>\n<p>The truth is that without regular use, static analysis is unlikely to significantly simplify development. After all, its main benefit for developers lies not so much in finding complex and controversial areas of code, but in detecting them early. It\u2019s frustrating to discover a problem when the changes have already gone for testing; not only is it unpleasant, but it's also very time-consuming. Regular static analysis reviews every change right on your computer and notifies you of suspicious areas while you work on the code.<\/p>\n<p>And if you or your colleagues are still uncertain about whether to implement the analyzer, I suggest you now read the article \"<noindex><a rel=\"nofollow\" href=\"https:\/\/www.viva64.com\/ru\/b\/0687\/\">Reasons to Implement a Static Code Analyzer PVS-Studio in the Development Process<\/a><\/noindex>\". It addresses common developer concerns that static analysis will take away their time and so on.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/514128\/\"><img decoding=\"async\" alt=\"Static analysis \u2013 from introduction to integration\" src=\"\/wp-content\/uploads\/2020\/08\/6372d668354f708cb0e08df27bb39bdd.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>If you want to share this article with an English-speaking audience, please use the link to the translation: Maxim Zvyagintsev. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/514128\/\">Static Analysis: From Getting Started to Integration<\/a><\/noindex>.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/pvs-studio\/blog\/514124\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0438 \u043a\u0430\u043a \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u0432\u0430\u0448\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043b\u0438\u0431\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0442\u043e\u0433\u0434\u0430, \u0434\u0430\u0436\u0435 \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u044f\u0441\u044c \u043e\u0431 \u044d\u0442\u043e\u043c, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u2013 \u043e\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0434\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-07T23:42:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-07T23:42:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Static Analysis \u2013 From Introduction to Integration | ProHoster","description":"Tired of endless code reviews or debugging, you sometimes wonder how to simplify your life. A little research, or perhaps a chance encounter, reveals the magical phrase: \"Static Analysis.\"","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u2013 \u043e\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0434\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 | ProHoster","og:description":"\u0423\u0441\u0442\u0430\u0432 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043d\u0447\u0430\u0435\u043c\u043e\u0433\u043e code review \u0438\u043b\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0448\u044c\u0441\u044f, \u043a\u0430\u043a \u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0436\u0438\u0437\u043d\u044c. \u0418 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0432, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435: &quot;\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&quot;.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/staticheskij-analiz-ot-znakomstva-do-integraczii","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-07T23:42:18+00:00","article:modified_time":"2020-08-07T23:42:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91065","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:35:24","updated":"2022-10-01 20:50:02","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/91065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=91065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/91065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/91066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=91065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=91065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=91065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}