{"id":307543,"date":"2020-07-27T15:00:21","date_gmt":"2020-07-27T15:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=307543"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=307543","title":{"rendered":"PVS-Studio: \u0410\u043d\u0430\u043b\u0438\u0437 pull request-\u043e\u0432 \u0432 Azure DevOps \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 self-hosted \u0430\u0433\u0435\u043d\u0442\u043e\u0432"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/pvs-studio\/blog\/512688\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/91\/vt\/l-\/91vtl--az32_rl5mz2ljtji4ifg.png\"><br \/>  \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0447\u0435\u043c \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445. \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f PVS-Studio \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 pull request-\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 self-hosted \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432 Microsoft Azure DevOps, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0433\u0440\u044b Minetest.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u043e \u0442\u043e\u043c, \u0441 \u0447\u0435\u043c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e<\/h2>\n<p>  <a href=\"https:\/\/www.minetest.net\/\">Minetest<\/a> \u2014 \u044d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043e\u043a\u043e\u043b\u043e 200 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 C, C++ \u0438 Lua. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0432 \u0432\u043e\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440, \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u043e\u0432 \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/minetest\/minetest\">https:\/\/github.com\/minetest\/minetest<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/pvs-studio\/\">PVS-Studio<\/a> \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 C, C++, C# \u0438 Java \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0435\u0444\u0435\u043a\u0442\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <a href=\"https:\/\/azure.microsoft.com\/\">Azure DevOps<\/a> \u2014 \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445.<\/p>\n<p>  \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 Azure \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 Windows \u0438 Linux. \u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0441\u043e\u043c\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432:<\/p>\n<ul>\n<li>\u0423 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0447\u0435\u043c \u0443 \u0412\u041c Azure;<\/li>\n<li>\u0410\u0433\u0435\u043d\u0442 \u043d\u0435 &quot;\u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442&quot; \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438;<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0441\u0431\u043e\u0440\u043a\u0438;<\/li>\n<li>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438;<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u043e\u043b\u0435\u0435 30 \u0437\u0430\u0434\u0430\u0447 \u0432 \u043c\u0435\u0441\u044f\u0446.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e self-hosted \u0430\u0433\u0435\u043d\u0442\u0430<\/h2>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 Azure \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 &quot;<a href=\"https:\/\/www.viva64.com\/ru\/b\/0670\/\">PVS-Studio \u0438\u0434\u0451\u0442 \u0432 \u043e\u0431\u043b\u0430\u043a\u0430: Azure DevOps<\/a>&quot;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u0441\u0440\u0430\u0437\u0443 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e self-hosted \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0435\u043d\u0442\u044b \u0438\u043c\u0435\u043b\u0438 \u043f\u0440\u0430\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043f\u0443\u043b\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Access Token. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 &quot;Personal Access Tokens&quot;, \u0432 \u043c\u0435\u043d\u044e &quot;User settings&quot;.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/fc7\/218\/49c\/fc721849c234f441facd08950f35b25b.png\" alt=\"image2.png\"><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 &quot;New token&quot; \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c Read &amp; manage Agent Pools (\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0447\u0435\u0440\u0435\u0437 &quot;Show all scopes&quot;).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2f2\/9fe\/0a0\/2f29fe0a0aa124db77ad092a141dd41d.png\" alt=\"image3.png\"><\/div>\n<p>  \u041d\u0443\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a Azure \u0431\u043e\u043b\u044c\u0448\u0435 \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cac\/f1a\/54e\/cacf1a54e69c9c4f8a1e1a45548b6965.png\" alt=\"image4.png\"><\/div>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Windows Server Core. \u0425\u043e\u0441\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043d\u0430 Windows 10 x64 \u0441 Hyper-V.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043e\u0431\u044a\u0451\u043c \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c.<\/p>\n<p>  \u0412 Windows \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b &#39;C:\\ProgramData\\Docker\\config\\daemon.json&#39; \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">{   &quot;registry-mirrors&quot;: [],   &quot;insecure-registries&quot;: [],   &quot;debug&quot;: true,   &quot;experimental&quot;: false,   &quot;data-root&quot;: &quot;d:\\\\docker&quot;,   &quot;storage-opts&quot;: [ &quot;size=40G&quot; ] }<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 &#39;D:\\docker-agent&#39; \u0434\u043e\u0431\u0430\u0432\u0438\u043c Docker \u0444\u0430\u0439\u043b \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"cpp\"># escape=`  FROM mcr.microsoft.com\/dotnet\/framework\/runtime  SHELL [&quot;cmd&quot;, &quot;\/S&quot;, &quot;\/C&quot;]  ADD https:\/\/aka.ms\/vs\/16\/release\/vs_buildtools.exe C:\\vs_buildtools.exe RUN C:\\vs_buildtools.exe --quiet --wait --norestart --nocache `   --installPath C:\\BuildTools `   --add Microsoft.VisualStudio.Workload.VCTools `   --includeRecommended  RUN powershell.exe -Command `   Set-ExecutionPolicy Bypass -Scope Process -Force; `   [System.Net.ServicePointManager]::SecurityProtocol =     [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `   iex ((New-Object System.Net.WebClient)     .DownloadString(&#39;https:\/\/chocolatey.org\/install.ps1&#39;)); `   choco feature enable -n=useRememberedArgumentsForUpgrades;    RUN powershell.exe -Command `   choco install -y cmake --installargs &#39;&quot;ADD_CMAKE_TO_PATH=System&quot;&#39;; `   choco install -y git --params &#39;&quot;\/GitOnlyOnPath \/NoShellIntegration&quot;&#39;  RUN powershell.exe -Command `   git clone https:\/\/github.com\/microsoft\/vcpkg.git; `   .\\vcpkg\\bootstrap-vcpkg -disableMetrics; `   $env:Path += &#39;&quot;;C:\\vcpkg&quot;&#39;; `   [Environment]::SetEnvironmentVariable(     &#39;&quot;Path&quot;&#39;, $env:Path, [System.EnvironmentVariableTarget]::Machine); `   [Environment]::SetEnvironmentVariable(     &#39;&quot;VCPKG_DEFAULT_TRIPLET&quot;&#39;, &#39;&quot;x64-windows&quot;&#39;,   [System.EnvironmentVariableTarget]::Machine)  RUN powershell.exe -Command `   choco install -y pvs-studio; `   $env:Path += &#39;&quot;;C:\\Program Files (x86)\\PVS-Studio&quot;&#39;; `   [Environment]::SetEnvironmentVariable(     &#39;&quot;Path&quot;&#39;, $env:Path, [System.EnvironmentVariableTarget]::Machine)  RUN powershell.exe -Command `   $latest_agent =     Invoke-RestMethod -Uri &quot;https:\/\/api.github.com\/repos\/Microsoft\/                           azure-pipelines-agent\/releases\/latest&quot;; `   $latest_agent_version =     $latest_agent.name.Substring(1, $latest_agent.tag_name.Length-1); `   $latest_agent_url =     &#39;&quot;https:\/\/vstsagentpackage.azureedge.net\/agent\/&quot;&#39; + $latest_agent_version +   &#39;&quot;\/vsts-agent-win-x64-&quot;&#39; + $latest_agent_version + &#39;&quot;.zip&quot;&#39;; `   Invoke-WebRequest -Uri $latest_agent_url -Method Get -OutFile .\/agent.zip; `   Expand-Archive -Path .\/agent.zip -DestinationPath .\/agent  USER ContainerAdministrator RUN reg add hklm\\system\\currentcontrolset\\services\\cexecsvc         \/v ProcessShutdownTimeoutSeconds \/t REG_DWORD \/d 60   RUN reg add hklm\\system\\currentcontrolset\\control         \/v WaitToKillServiceTimeout \/t REG_SZ \/d 60000 \/f  ADD .\\entrypoint.ps1 C:\\entrypoint.ps1 SHELL [&quot;powershell&quot;, &quot;-Command&quot;,        &quot;$ErrorActionPreference = &#39;Stop&#39;;      $ProgressPreference = &#39;SilentlyContinue&#39;;&quot;] ENTRYPOINT .\\entrypoint.ps1<\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 MSBuild \u0434\u043b\u044f C++, \u0441 Chocolatey \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 PVS-Studio, CMake \u0438 Git. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f Vcpkg. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0436\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, Azure Pipelines Agent.<\/p>\n<p>  \u0414\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0433\u0435\u043d\u0442\u0430 \u0438\u0437 ENTRYPOINT-\u0430 Docker \u0444\u0430\u0439\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f PowerShell \u0441\u043a\u0440\u0438\u043f\u0442 &#39;entrypoint.ps1&#39;, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c URL &quot;\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438&quot; \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u043e\u043a\u0435\u043d \u043f\u0443\u043b\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 PVS-Studio:<\/p>\n<pre><code class=\"cpp\">$organization_url = &quot;https:\/\/dev.azure.com\/&lt;\u0430\u043a\u043a\u0430\u0443\u043d\u0442 Microsoft Azure&gt;&quot; $agents_token = &quot;&lt;token \u0430\u0433\u0435\u043d\u0442\u0430&gt;&quot;  $pvs_studio_user = &quot;&lt;\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f PVS-Studio&gt;&quot; $pvs_studio_key = &quot;&lt;\u043a\u043b\u044e\u0447 PVS-Studio&gt;&quot;  try {   C:\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat    PVS-Studio_Cmd credentials -u $pvs_studio_user -n $pvs_studio_key      .\\agent\\config.cmd --unattended `     --url $organization_url `     --auth PAT `     --token $agents_token `     --replace;   .\\agent\\run.cmd }  finally {   # Agent graceful shutdown   # https:\/\/github.com\/moby\/moby\/issues\/25982      .\\agent\\config.cmd remove --unattended `     --auth PAT `     --token $agents_token }<\/code><\/pre>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0430\u0433\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"cpp\">docker build -t azure-agent -m 4GB . docker run -id --name my-agent -m 4GB --cpu-count 4 azure-agent<\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/de7\/755\/ec9\/de7755ec9a5de6cb1d73c09d3d24db3e.png\" alt=\"image5.png\"><\/div>\n<p>  \u0410\u0433\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0438 \u0433\u043e\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/874\/745\/287\/874745287a32a5ffc1aca8fdd477f544.png\" alt=\"image6.png\"><\/div>\n<p>  <\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043d\u0430 self-hosted \u0430\u0433\u0435\u043d\u0442\u0435<\/h2>\n<p>  \u0414\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 PR \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 pipeline \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/034\/ce7\/2cc\/034ce72cc09aec54dfb5fb7b3286de83.png\" alt=\"image7.png\"><\/div>\n<p>  <\/p>\n<pre><code class=\"cpp\">trigger: none  pr:   branches:     include:     - &#39;*&#39;  pool: Default  steps: - script: git diff --name-only     origin\/%SYSTEM_PULLREQUEST_TARGETBRANCH% &gt;     diff-files.txt   displayName: &#39;Get committed files&#39;  - script: |     cd C:\\vcpkg     git pull --rebase origin     CMD \/C &quot;.\\bootstrap-vcpkg -disableMetrics&quot;     vcpkg install ^     irrlicht zlib curl[winssl] openal-soft libvorbis ^     libogg sqlite3 freetype luajit     vcpkg upgrade --no-dry-run   displayName: &#39;Manage dependencies (Vcpkg)&#39;  - task: CMake@1   inputs:     cmakeArgs: -A x64       -DCMAKE_TOOLCHAIN_FILE=C:\/vcpkg\/scripts\/buildsystems\/vcpkg.cmake       -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=0 -DENABLE_CURSES=0 ..   displayName: &#39;Run CMake&#39;  - task: MSBuild@1   inputs:     solution: &#39;**\/*.sln&#39;     msbuildArchitecture: &#39;x64&#39;     platform: &#39;x64&#39;     configuration: &#39;Release&#39;     maximumCpuCount: true   displayName: &#39;Build&#39;  - script: |     IF EXIST .\\PVSTestResults RMDIR \/Q\/S .\\PVSTestResults     md .\\PVSTestResults     PVS-Studio_Cmd ^     -t .\\build\\minetest.sln ^     -S minetest ^     -o .\\PVSTestResults\\minetest.plog ^     -c Release ^     -p x64 ^     -f diff-files.txt ^     -D C:\\caches     PlogConverter ^     -t FullHtml ^     -o .\\PVSTestResults\\ ^     -a GA:1,2,3;64:1,2,3;OP:1,2,3 ^     .\\PVSTestResults\\minetest.plog     IF NOT EXIST &quot;$(Build.ArtifactStagingDirectory)&quot; ^     MKDIR &quot;$(Build.ArtifactStagingDirectory)&quot;     powershell -Command ^     &quot;Compress-Archive -Force ^     &#39;.\\PVSTestResults\\fullhtml&#39; ^     &#39;$(Build.ArtifactStagingDirectory)\\fullhtml.zip&#39;&quot;   displayName: &#39;PVS-Studio analyze&#39;   continueOnError: true  - task: PublishBuildArtifacts@1   inputs:     PathtoPublish: &#39;$(Build.ArtifactStagingDirectory)&#39;     ArtifactName: &#39;psv-studio-analisys&#39;     publishLocation: &#39;Container&#39;   displayName: &#39;Publish analysis report&#39;<\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 PR \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043d\u0430 \u0430\u0433\u0435\u043d\u0442\u0430\u0445, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0432 \u043f\u0443\u043b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u044d\u0442\u0438\u043c \u043f\u0443\u043b\u043e\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/789\/1f7\/1c3\/7891f71c3ce396c8efd80a6ef8df776a.png\" alt=\"image8.png\"><\/div>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/9d9\/a17\/26e\/9d9a1726e49a2fe09a957d692ea517a7.png\" alt=\"image9.png\"><\/div>\n<p>  \u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 git diff. \u0417\u0430\u0442\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f solution \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 CMake, \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0430.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0438\u0437\u043c\u0435\u043d\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u0432 (\u0444\u043b\u0430\u0433 &#39;-f diff-files.txt&#39;), \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 CMake \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b (\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0444\u043b\u0430\u0433\u043e\u043c &#39;-S minetest&#39;). \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u043c\u0438 \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 C++ \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (\u0444\u043b\u0430\u0433 &#39;-D C:\\caches&#39;).<\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043e\u0431 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/089\/9b3\/166\/0899b3166dd7a62e8c5208e43dd9c271.png\" alt=\"image10.png\"><\/div>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cdc\/120\/f89\/cdc120f8927fead1b8d955ef12286393.png\" alt=\"image11.png\"><\/div>\n<p>  \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0431\u043e\u043d\u0443\u0441\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f self-hosted \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0449\u0443\u0442\u0438\u043c\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, \u0437\u0430 \u0441\u0447\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/252\/558\/8bd\/2525588bd2c39b1a72d3b892b256eb2a.png\" alt=\"image13.png\"><\/div>\n<p>  <\/p>\n<h2>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 Minetest<\/h2>\n<p>  <b>\u0417\u0430\u0442\u0438\u0440\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v519\/\">V519<\/a> The &#39;color_name&#39; variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 621, 627. string.cpp 627<\/p>\n<pre><code class=\"cpp\">static bool parseNamedColorString(const std::string &amp;value,                                   video::SColor &amp;color) {   std::string color_name;   std::string alpha_string;    size_t alpha_pos = value.find(&#39;#&#39;);   if (alpha_pos != std::string::npos) {     color_name = value.substr(0, alpha_pos);     alpha_string = value.substr(alpha_pos + 1);   } else {     color_name = value;   }    color_name = lowercase(value); \/\/ &lt;=    std::map&lt;const std::string, unsigned&gt;::const_iterator it;   it = named_colors.colors.find(color_name);   if (it == named_colors.colors.end())     return false;   .... }<\/code><\/pre>\n<p>  \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0431\u043e\u0440 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <i>Green#77<\/i>) \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043a\u043e\u0434. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <i>color_name<\/i> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u043b\u0438\u0431\u043e \u043a\u043e\u043f\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u0432 \u043d\u0438\u0436\u043d\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0435\u0451 \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438. \u041c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">color_name = lowercase(color_name);<\/code><\/pre>\n<p>  <b>\u041b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0439<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v547\/\">V547<\/a> Expression &#39;nearest_emergefull_d == \u2014 1&#39; is always true. clientiface.cpp 363<\/p>\n<pre><code class=\"cpp\">void RemoteClient::GetNextBlocks (....) {   ....   s32 nearest_emergefull_d = -1;   ....   s16 d;   for (d = d_start; d &lt;= d_max; d++) {     ....       if (block == NULL || surely_not_found_on_disk || block_is_invalid) {         if (emerge-&gt;enqueueBlockEmerge(peer_id, p, generate)) {           if (nearest_emerged_d == -1)             nearest_emerged_d = d;         } else {           if (nearest_emergefull_d == -1) \/\/ &lt;=             nearest_emergefull_d = d;           goto queue_full_break;         }   ....   }   .... queue_full_break:   if (nearest_emerged_d != -1) { \/\/ &lt;=     new_nearest_unsent_d = nearest_emerged_d;   } else .... }<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <i>nearest_emergefull_d<\/i> \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0446\u0438\u043a\u043b\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0438 \u0435\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0445\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041b\u0438\u0431\u043e \u044d\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0433\u043e copy-paste, \u043b\u0438\u0431\u043e \u0441 \u043d\u0435\u0439 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v560\/\">V560<\/a> A part of conditional expression is always false: y &gt; max_spawn_y. mapgen_v7.cpp 262<\/p>\n<pre><code class=\"cpp\">int MapgenV7::getSpawnLevelAtPoint(v2s16 p) {   ....   while (iters &gt; 0 &amp;&amp; y &lt;= max_spawn_y) {               \/\/ &lt;=     if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {       if (y &lt;= water_level || y &gt; max_spawn_y)          \/\/ &lt;=         return MAX_MAP_GENERATION_LIMIT; \/\/ Unsuitable spawn point        \/\/ y + 1 due to biome &#39;dust&#39;       return y + 1;     }   .... }<\/code><\/pre>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 &#39;<i>y<\/i>&#39; \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0446\u0438\u043a\u043b\u0430. \u041f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0435 \u0435\u0439, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 <i>false<\/i> \u0438, \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f.<\/p>\n<p>  <b>\u041f\u043e\u0442\u0435\u0440\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v595\/\">V595<\/a> The &#39;m_client&#39; pointer was utilized before it was verified against nullptr. Check lines: 183, 187. game.cpp 183<\/p>\n<pre><code class=\"cpp\">void gotText(const StringMap &amp;fields) {   ....   if (m_formname == &quot;MT_DEATH_SCREEN&quot;) {     assert(m_client != 0);     m_client-&gt;sendRespawn();     return;   }    if (m_client &amp;&amp; m_client-&gt;modsLoaded())     m_client-&gt;getScript()-&gt;on_formspec_input(m_formname, fields); }<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e <i>m_client<\/i> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043b\u0438 \u043e\u043d \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <i>assert<\/i>. \u041d\u043e \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435. \u0422\u0430\u043a\u0430\u044f \u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0432 \u0440\u0435\u043b\u0438\u0437, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0443, \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0438\u0441\u043a \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  <b>\u0411\u0438\u0442 \u0438\u043b\u0438 \u043d\u0435 \u0431\u0438\u0442?<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v616\/\">V616<\/a> The &#39;(FT_RENDER_MODE_NORMAL)&#39; named constant with the value of 0 is used in the bitwise operation. CGUITTFont.h 360<\/p>\n<pre><code class=\"cpp\">typedef enum  FT_Render_Mode_ {   FT_RENDER_MODE_NORMAL = 0,   FT_RENDER_MODE_LIGHT,   FT_RENDER_MODE_MONO,   FT_RENDER_MODE_LCD,   FT_RENDER_MODE_LCD_V,    FT_RENDER_MODE_MAX } FT_Render_Mode;  #define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) &amp; 15 ) &lt;&lt; 16 ) #define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )  void update_load_flags() {   \/\/ Set up our loading flags.   load_flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER;   if (!useHinting()) load_flags |= FT_LOAD_NO_HINTING;   if (!useAutoHinting()) load_flags |= FT_LOAD_NO_AUTOHINT;   if (useMonochrome()) load_flags |=      FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO | FT_RENDER_MODE_MONO;   else load_flags |= FT_LOAD_TARGET_NORMAL; \/\/ &lt;= }<\/code><\/pre>\n<p>  \u041c\u0430\u043a\u0440\u043e\u0441 <i>FT_LOAD_TARGET_NORMAL<\/i> \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u043e\u043b\u044c, \u0438 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0435 &quot;\u0438\u043b\u0438&quot; \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0444\u043b\u0430\u0433\u0438 \u0432 <i>load_flags<\/i>, \u0432\u0435\u0442\u043a\u0430 <i>else<\/i> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0431\u0440\u0430\u043d\u0430.<\/p>\n<p>  <b>\u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v636\/\">V636<\/a> The &#39;rect.getHeight() \/ 16&#39; expression was implicitly cast from &#39;int&#39; type to &#39;float&#39; type. Consider utilizing an explicit type cast to avoid the loss of a fractional part. An example: double A = (double)(X) \/ Y;. hud.cpp 771<\/p>\n<pre><code class=\"cpp\">void drawItemStack(....) {   float barheight = rect.getHeight() \/ 16;   float barpad_x = rect.getWidth() \/ 16;   float barpad_y = rect.getHeight() \/ 16;    core::rect&lt;s32&gt; progressrect(     rect.UpperLeftCorner.X + barpad_x,     rect.LowerRightCorner.Y - barpad_y - barheight,     rect.LowerRightCorner.X - barpad_x,     rect.LowerRightCorner.Y - barpad_y); }<\/code><\/pre>\n<p>  \u0413\u0435\u0442\u0442\u0435\u0440\u044b <i>rect<\/i> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c. \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445 \u0440\u0430\u0441\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <b>\u041f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v646\/\">V646<\/a> Consider inspecting the application&#39;s logic. It&#39;s possible that &#39;else&#39; keyword is missing. treegen.cpp 413<\/p>\n<pre><code class=\"cpp\">treegen::error make_ltree(...., TreeDef tree_definition) {   ....   std::stack &lt;core::matrix4&gt; stack_orientation;   ....     if ((stack_orientation.empty() &amp;&amp;       tree_definition.trunk_type == &quot;double&quot;) ||       (!stack_orientation.empty() &amp;&amp;       tree_definition.trunk_type == &quot;double&quot; &amp;&amp;       !tree_definition.thin_branches)) {       ....     } else if ((stack_orientation.empty() &amp;&amp;       tree_definition.trunk_type == &quot;crossed&quot;) ||       (!stack_orientation.empty() &amp;&amp;       tree_definition.trunk_type == &quot;crossed&quot; &amp;&amp;       !tree_definition.thin_branches)) {       ....     } if (!stack_orientation.empty()) {                  \/\/ &lt;=   ....   }   .... }<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <i>else-if<\/i> \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432. \u041f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0431\u043b\u043e\u043a <i>if<\/i> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 <i>else<\/i> \u0441\u043a\u043e\u0431\u043a\u043e\u0439. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e: \u0434\u043e \u044d\u0442\u043e\u0433\u043e <i>if<\/i>-\u0430 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438 \u0441\u0442\u0432\u043e\u043b\u0430, \u0430 \u0441\u043b\u0435\u0434\u043e\u043c \u043b\u0438\u0441\u0442\u044c\u0435\u0432; \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 <i>else<\/i>. \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/p>\n<p>  <b>\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v668\/\">V668<\/a> There is no sense in testing the &#39;clouds&#39; pointer against null, as the memory was allocated using the &#39;new&#39; operator. The exception will be generated in the case of memory allocation error. game.cpp 1367<\/p>\n<pre><code class=\"cpp\">bool Game::createClient(....) {   if (m_cache_enable_clouds) {     clouds = new Clouds(smgr, -1, time(0));     if (!clouds) {       *error_message = &quot;Memory allocation error (clouds)&quot;;       errorstream &lt;&lt; *error_message &lt;&lt; std::endl;       return false;     }   } }<\/code><\/pre>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 <i>new<\/i> \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <i>std::bad_alloc<\/i>, \u0438 \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e <i>try-catch<\/i> \u0431\u043b\u043e\u043a\u043e\u043c. \u0410 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430.<\/p>\n<p>  <b>\u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/b><\/p>\n<p>  <a href=\"https:\/\/www.viva64.com\/ru\/w\/v781\/\">V781<\/a> The value of the &#39;i&#39; index is checked after it was used. Perhaps there is a mistake in program logic. irrString.h 572<\/p>\n<pre><code class=\"cpp\">bool equalsn(const string&lt;T,TAlloc&gt;&amp; other, u32 n) const {   u32 i;   for(i=0; array[i] &amp;&amp; other[i] &amp;&amp; i &lt; n; ++i) \/\/ &lt;=     if (array[i] != other[i])       return false;    \/\/ if one (or both) of the strings was smaller then they   \/\/ are only equal if they have the same length   return (i == n) || (used == other.used); }<\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0448\u0438\u0431\u043a\u0435. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">for (i=0; i &lt; n; ++i) \/\/ &lt;=   if (!array[i] || !other[i] || array[i] != other[i])     return false;<\/code><\/pre>\n<p>  <b>\u0414\u0440\u0443\u0433\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438<\/b><\/p>\n<p>  \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0443 pull request-\u043e\u0432 \u0432 Azure DevOps \u0438 \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u0442 \u0446\u0435\u043b\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Minetest. \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0451\u0439 \u0434\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0430\u0441\u0442 PVS-Studio.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0433\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430\u043d\u0430\u043b\u0438\u0437 PVS-Studio \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 CI\/CD. \u0410 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 pull request-\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Enterprise \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e Enterprise \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u044d\u0442\u043e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u043d\u0430 <a href=\"https:\/\/www.viva64.com\/ru\/pvs-studio-download\/\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f<\/a>. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u043c\u0435\u0436\u0434\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <a href=\"https:\/\/www.viva64.com\/ru\/order\/\">\u0437\u0430\u043a\u0430\u0437\u0430 PVS-Studio<\/a>.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/512680\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/898\/3b6\/5a7\/8983b65a74adb29a2113eba12fbec3f1.png\"><\/div>\n<p><\/a><br \/>  \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u0441 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0435\u0439, \u0442\u043e \u043f\u0440\u043e\u0448\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434: Alexey Govorov. <a href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/512680\/\">PVS-Studio: analyzing pull requests in Azure DevOps using self-hosted agents<\/a>.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/pvs-studio\/blog\/512688\/\"> https:\/\/habr.com\/ru\/company\/pvs-studio\/blog\/512688\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/pvs-studio\/blog\/512688\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/91\/vt\/l-\/91vtl--az32_rl5mz2ljtji4ifg.png\"><br \/>  \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0447\u0435\u043c \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445. \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f PVS-Studio \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u043e\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 pull request-\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 self-hosted \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432 Microsoft Azure DevOps, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0433\u0440\u044b Minetest.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-307543","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=307543"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307543\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}