{"id":342011,"date":"2022-12-01T09:00:45","date_gmt":"2022-12-01T09:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=342011"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=342011","title":{"rendered":"<span>SAST \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445. \u041e\u0431\u0437\u043e\u0440 open-source \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f C\/C++<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sw\/wj\/9z\/swwj9zbqqwnfi1ge9a9j9axpkne.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sw\/wj\/9z\/swwj9zbqqwnfi1ge9a9j9axpkne.png\"\/><\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u044b\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u0432 \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f must-have \u0441\u043a\u0438\u043b\u043b\u043e\u043c. \u0418\u0441\u043a\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u0434\u0435, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432\u043f\u043e\u043b\u043d\u0435 \u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. \u041d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u043e\u0441\u043a\u043e\u0448\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442. <a name=\"habracut\"><\/a>\u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0441\u0435\u0431\u044f \u0434\u043e\u043b\u0433\u043e \u0436\u0434\u0430\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0432 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u043e\u043d\u0443\u0442\u044c. \u0420\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u0432\u0441\u0435\u0445 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u043a\u043d\u0438\u0433\u0438. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0433\u043b\u0430\u0432\u043d\u044b\u043c\u0438 \u0433\u0435\u0440\u043e\u044f\u043c\u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043c\u0435\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 C\/C++ (\u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0432 \u0430\u0441\u043f\u0435\u043a\u0442\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0438 \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432 SonarQube), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\/\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\/\u0442\u0438\u043f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0438\u043b\u0438\u044f\u043c\u0438. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043e\u0431\u0437\u043e\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u044c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0446\u0430\u043c\u0438 \u0438 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044f. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0435\u043c \u0444\u0430\u0432\u043e\u0440\u0438\u0442\u0435, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u0432\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0437\u043e\u0440, \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0438\u0441\u0442\u043e\u043a\u0430\u043c. \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 SAST \u0438 \u0437\u0430 \u0447\u0442\u043e \u0435\u0433\u043e \u0442\u0430\u043a \u0432\u0441\u0435 <del>\u043d\u0435<\/del> \u043b\u044e\u0431\u044f\u0442.<\/p>\n<p>  <\/p>\n<h3 id=\"chto-takoe-sast\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 SAST?<\/h3>\n<p>  <\/p>\n<p>SAST (Static Application Security Testing) \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041a\u0430\u043a \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 <a href=\"https:\/\/github.com\/analysis-tools-dev\/static-analysis\">github-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a> Analysis Tools. \u0412\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e \u043e\u0431\u044a\u0435\u043c\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d OWASP Foundation \u2013 <a href=\"https:\/\/owasp.org\/www-community\/Source_Code_Analysis_Tools\">Source Code Analysis Tools<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e SAST \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043e\u0442\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u0435\u0441\u0442\u043d\u043e. \u0422\u0430\u043a \u0443\u0436 \u0432\u044b\u0448\u043b\u043e, \u0447\u0442\u043e \u043e\u0431\u0449\u0435\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a SAST \u0443 \u0440\u044f\u0434\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u043a\u0435\u043f\u0442\u0438\u0447\u043d\u043e-\u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0432\u0432\u0438\u0434\u0443 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0439. \u042d\u0442\u043e \u043e\u0442\u0431\u0438\u0432\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0442\u0440\u0430\u0442\u044f \u043d\u0430 \u043d\u0438\u0445 \u0441\u0432\u043e\u0435 \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0443\u0431\u0435\u0434\u0438\u0442\u044c, \u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2014 \u043d\u0435 \u043f\u0430\u043d\u0430\u0446\u0435\u044f, \u0430 \u043b\u0438\u0448\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0417\u043d\u0430\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\/\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0431\u0430\u0433\u0430\u043c, \u043d\u0443 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0442 \u043f\u043e\u0438\u0441\u043a \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0433\u0440\u0443\u0434\u0435 \u043a\u043e\u0434\u0430. <\/p>\n<p>  <\/p>\n<h3 id=\"nashi-podopytnye\">\u041d\u0430\u0448\u0438 \u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u044b\u0435<\/h3>\n<p>  <\/p>\n<p>\u0421 \u0443\u0447\u0435\u0442\u043e\u043c \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u0434\u043b\u044f \u043e\u0431\u0437\u043e\u0440\u0430 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"#semgrep\">Semgrep<\/a><\/li>\n<li><a href=\"#codeql\">CodeQL<\/a><\/li>\n<li><a href=\"#weggli\">Weggli<\/a><\/li>\n<li><a href=\"#joern\">Joern<\/a><\/li>\n<li><a href=\"#mate\">MATE<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0438\u0445, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438. \u0411\u044b\u043b\u043e \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u0438, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 <a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/658.html\">Weaknesses in Software Written in C<\/a> \u0438 <a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/659.html\">Weaknesses in Software Written in C++<\/a>, \u043d\u043e \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u043d\u0438\u0445 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043a\u0446\u0435\u043d\u0442 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u0445 \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418 \u044d\u0442\u043e\u2026 <strong>double-free<\/strong>, \u043e\u043d\u0430 \u0436\u0435 <a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/415.html\">CWE-415<\/a>! \u0414\u0430\u043d\u043d\u0430\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u0438 \u043f\u043e\u0447\u0442\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u0437\u0440\u0430\u0441\u0442, \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u044f\u0434\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u0445 \u0441\u043d\u0438\u043f\u043f\u0435\u0442\u043e\u0432 \u043a\u043e\u0434\u0430, \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043b\u043e\u0432\u0443\u0448\u0435\u043a \u0434\u043b\u044f SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u043b\u044e\u0434\u0435\u0439 \u044d\u0442\u0438 &#171;\u043b\u043e\u0432\u0443\u0448\u043a\u0438&#187; \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043c\u0435\u0448\u043d\u044b\u043c\u0438, \u043d\u043e \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e \u0446\u0435\u043b\u043e\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0443\u043c\u0435\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Control Flow, \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0438 \u0442.\u0434. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0431\u044b\u0442\u044c \u0432 \u043a\u0443\u0440\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u0440\u0430\u0432\u0438\u043b\/\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0418\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0441\u044f \u0432 github-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/Nalen98\/double-free-samples\">&#171;double-free-samples&#187;<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0444\u043e\u0440\u043c\u0438\u043c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0447\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u043e \u0431\u0430\u0433\u0430\u043c \u0432 \u043a\u043e\u0434\u0435 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0412 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u0430\u0445 \u043a\u043e\u0434\u0430 \u0438 \u043e &#171;\u043b\u043e\u0432\u0443\u0448\u043a\u0430\u0445&#187; \u0434\u043b\u044f SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442.\u0435. \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445, \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u0435\u0439\u0441\u044b. <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Checklist<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u2116<\/th>\n<th>\u0422\u0438\u043f<\/th>\n<th>\u041c\u0435\u0441\u0442\u043e \u0432 \u043a\u043e\u0434\u0435<\/th>\n<th>\u041c\u0435\u0442\u043e\u0434<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:14<\/code><\/td>\n<td><code>double_free()<\/code><\/td>\n<td>\u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 double-free<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\u043d\u0435 \u0443\u044f\u0437\u0432\u0438\u043c<\/td>\n<td><code>funcs.cpp:24<\/code><\/td>\n<td><code>no_double_free()<\/code><\/td>\n<td>\u041f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:41<\/code><\/td>\n<td><code>df_by_pointer()<\/code><\/td>\n<td>\u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 double-free, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:57<\/code><\/td>\n<td><code>df_with_wrappers()<\/code><\/td>\n<td>double-free \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c-\u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 <code>wrapper(char *ptr)<\/code> \u043d\u0430\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>free<\/code><\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:69<\/code><\/td>\n<td><code>conditional_dfree()<\/code><\/td>\n<td>double-free \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432 if-\u0431\u043b\u043e\u043a\u0435<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:70<\/code><\/td>\n<td><code>conditional_dfree()<\/code><\/td>\n<td>double-free \u0431\u0435\u0437 \u0437\u0430\u0445\u043e\u0434\u0430 \u0432 if-block + trio free 0_o<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>\u043d\u0435 \u0443\u044f\u0437\u0432\u0438\u043c<\/td>\n<td><code>funcs.cpp:80<\/code><\/td>\n<td><code>free_null()<\/code><\/td>\n<td>\u041f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:89<\/code><\/td>\n<td><code>double_delete()<\/code><\/td>\n<td>\u0422\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 double-delete<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>\u043d\u0435 \u0443\u044f\u0437\u0432\u0438\u043c<\/td>\n<td><code>funcs.cpp:105<\/code><\/td>\n<td><code>intrnl_reassignment()<\/code><\/td>\n<td>\u041f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>reassignment(char *ptr)<\/code>, \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td><strong>\u0443\u044f\u0437\u0432\u0438\u043c<\/strong><\/td>\n<td><code>funcs.cpp:117<\/code><\/td>\n<td><code>bad_goto()<\/code><\/td>\n<td>double-free \u043f\u043e\u0441\u043b\u0435 goto-\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430<\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>\u043d\u0435 \u0443\u044f\u0437\u0432\u0438\u043c<\/td>\n<td><code>funcs.cpp:133<\/code><\/td>\n<td><code>good_goto()<\/code><\/td>\n<td>\u041d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>free<\/code>, \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432 \u043a \u0441\u0431\u043e\u0440\u043a\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e, \u043d\u0430 \u0434\u0435\u043b\u0435 \u0443 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043e\u0434 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c, \u0432\u0435\u0434\u044c \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0447\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. <\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0436\u0435 \u043d\u0430\u0448 \u043e\u0431\u0437\u043e\u0440!<\/p>\n<p>  <\/p>\n<h3 id=\"semgrep\">Semgrep<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ht\/le\/oj\/htleojlvrmqg2mmshy2kl83mih4.png\" width=\"250\" height=\"150\" data-src=\"https:\/\/habrastorage.org\/webt\/ht\/le\/oj\/htleojlvrmqg2mmshy2kl83mih4.png\"\/><\/div>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/returntocorp\/semgrep\">Semgrep<\/a> \u2014 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435. \u0411\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <a href=\"https:\/\/r2c.dev\/#semgrep\">r2c<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043c \u043d\u0430 OCaml. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2020 \u0433\u043e\u0434\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f &#171;From Zero To Hero&#187; \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0439. \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044f\u0437\u044b\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0438\u043b\u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 Semgrep \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430, \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (AST), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u044f\u0437\u044b\u043a, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0436\u0435 \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437. \u042d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e <a href=\"https:\/\/semgrep.dev\/docs\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0445\u0432\u0430\u043b\u0435\u0431\u043d\u044b\u0445 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u043e\u0442 AppSec-\u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439. \u041c\u044b \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0431\u043e\u0439\u0434\u0435\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u0435\u0433\u043e <strong>\u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong> \u2014 \u0432\u043e\u0442 \u043e\u043d\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438: C#, Go, Java, JavaScript, JSX, JSON, PHP, Python, Ruby, Scala, TypeScript, TSX. C\/C++ \u0438\u043c\u0435\u044e\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u043a\u0430\u043a \u0438 <a href=\"https:\/\/semgrep.dev\/docs\/supported-languages\/\">\u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435<\/a><\/li>\n<li>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li>\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438<\/li>\n<li>\u0418\u043c\u0435\u0435\u0442 \u043a\u0440\u0443\u0442\u0443\u044e <a href=\"https:\/\/semgrep.dev\/playground\/new\">playground-\u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0443<\/a> \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443<\/li>\n<li>\u0412 <a href=\"https:\/\/semgrep.dev\/r\">\u0440\u0435\u0435\u0441\u0442\u0440\u0435<\/a> semgrep-\u043f\u0440\u0430\u0432\u0438\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c security rules \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0438 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043c\u0438<\/li>\n<li>\u0415\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/semgrep.dev\/docs\/trophy-case\/\">Trophy\u0421ase<\/a> \u2014 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 CVE \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Semgrep<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>\u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043e\u043a<\/strong>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0434\u0440\u044f\u0434 \u0431\u0435\u0437 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0447\u0442\u043e, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/li>\n<li>\u041d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f C\/C++<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 C\/C++ \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439, \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043d\u0435 \u043c\u043d\u043e\u0433\u043e. \u0412 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u0437\u0440\u0435\u043b\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Java, Python, Go, Ruby, C#, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0439 ruleset.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c Marco Ivaldi \u0432 \u0441\u0442\u0430\u0442\u044ce <a href=\"https:\/\/security.humanativaspa.it\/semgrep-ruleset-for-c-c-vulnerability-research\/\">&#171;Semgrep ruleset for C\/C++ vulnerability research&#187;<\/a>. \u041e\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 C\/C++, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0435\u0433\u043e <a href=\"https:\/\/github.com\/0xdea\/semgrep-rules\">github-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/returntocorp\/semgrep-rules\">semgrep-rules<\/a>, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f C++. \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0438 \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0432\u043d\u0435\u0441\u0442\u0438 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 &#171;\u0441\u0438\u0448\u043d\u043e\u0433\u043e&#187; \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 Semgrep, \u0432\u044b \u043d\u0443\u0436\u043d\u044b, \u043a\u0430\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430!<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0435\u0436\u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a, Global taint<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0434 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u043a \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0435 <code>#include &lt;><\/code> \u0438\u043b\u0438 <code>#include \"\"<\/code>. Semgrep \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438. \u0422\u0430\u043a\u043e\u0432\u044b \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0435.<\/p>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 DataFlow \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0448\u0438\u0440\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f, \u043a\u0430\u043a \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. Tainting tracking \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0432\u0432\u043e\u0434) \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0438\u0445 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. Taint-\u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0438\u0434\u044b:<\/p>\n<p>  <\/p>\n<p>1) Local taint \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0431\u0440\u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u0430, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<p>  <\/p>\n<p>2) Global taint \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a &#171;\u043f\u043e\u0440\u0447\u0438&#187; \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 Semgrep \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430, \u0430 \u043d\u043e\u0432\u043e\u043c\u043e\u0434\u043d\u044b\u0439 <a href=\"https:\/\/semgrep.dev\/docs\/writing-rules\/data-flow\/taint-mode\/\">&#171;Taint mode&#187;<\/a> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u043a\u043e\u0440\u0435\u0435 \u0431\u0435\u0441\u0442\u043e\u043b\u043a\u043e\u0432\u043e, \u0447\u0435\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442 r2c \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/r2c.dev\/blog\/2022\/introducing-deepSemgrep\/\">DeepSemgrep<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b global taint. \u0427\u0442\u043e\u0431\u044b \u0438\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b <code>semgrep<\/code> \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">semgrep --deep<\/code><\/pre>\n<p>  <\/p>\n<p>\u0430 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f <code>pattern-sources<\/code> \u0438 <code>pattern-sinks<\/code>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e Java \u0438 Ruby. \u041d\u0430 \u044d\u0442\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 Semgrep \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0440\u0430\u0432\u0438\u043b\u0430.<\/p>\n<p>  <\/p>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 Semgrep \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0435 (\u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0435) \u0438 YAML-\u043f\u0440\u0430\u0432\u0438\u043b\u0430. <\/p>\n<p>  <\/p>\n<p>\u042d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u043a\u0440\u0430\u0442\u043a\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#171;\u0432\u043c\u0435\u0441\u0442\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u043b\u043e\u0432&#187;. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 double-free:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">semgrep -e 'free($VAR); ... free($VAR);' --lang=c path\/to\/src<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u0442\u043e\u0447\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u0447\u0430\u043d\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0448 \u043f\u043e\u0438\u043d\u0442\u0435\u0440, \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043f\u0435\u0440\u0435\u0434 \u0432\u0442\u043e\u0440\u044b\u043c \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c YAML-\u0444\u0430\u0439\u043b \u0438 \u0432 \u043d\u0451\u043c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 Semgrep:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>id<\/code> \u2014 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b\u0430<\/li>\n<li><code>metadata<\/code> \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0435, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e, \u043a\u0430\u043a \u0437\u0434\u0435\u0441\u044c, <code>references<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e CWE<\/li>\n<li><code>message<\/code> \u2014 \u043f\u043e\u043b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430<\/li>\n<li><code>severity<\/code> \u2014 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438: INFO, WARNING, ERROR<\/li>\n<li><code>languages<\/code> \u2014 \u044f\u0437\u044b\u043a, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e<\/li>\n<li><code>patterns<\/code> \u2014 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e &#171;AND&#187;<\/li>\n<li><code>pattern-either<\/code> \u2014 \u043a\u0430\u043a <code>patterns<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c &#171;OR&#187;<\/li>\n<li><code>pattern<\/code> \u2014 \u0448\u0430\u0431\u043b\u043e\u043d, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u043e\u0431\u043e\u0439 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li><code>pattern-not<\/code> \u2014 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435<\/li>\n<li><code>pattern-inside<\/code> \u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/li>\n<li><code>pattern-not-inside<\/code> \u2014 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<p>Semgrep \u0431\u043e\u0433\u0430\u0442 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0421 \u043d\u0438\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/semgrep.dev\/docs\/writing-rules\/rule-syntax\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>pattern-regex<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 PCRE-\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0435, <code>metavariable-pattern<\/code> \u0438 <code>metavariable-regex<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\/PCRE-\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a: <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">config.yaml<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">rules:   - id: detect-double-free     metadata:       references:         - https:\/\/cwe.mitre.org\/data\/definitions\/415.html            message: >-       Some vulnerable (and not) double-free cases. If malloc() returns       the same value twice and the program later gives the attacker control        over the data that is written into this doubly-allocated memory,       the program becomes vulnerable to a buffer overflow attack.     severity: ERROR     languages:       - cpp     pattern-either:       - patterns:         - pattern: |             free($PTR);             ...             free($PTR);         - pattern-not: |             free($PTR);             ...             $PTR = $EXPR;             ...             free($PTR);         - pattern-not-inside: |             $FTYPE $FUNC(..., $TYPE $ARG, ...){               ...               $ARG = $EXPR;               ...             }             ...             $FUNC($PTR);             ...         - pattern-not-inside: |             if ($CONF){               ...               goto $LAB;             }             ...             free($PTR);             ...             $LAB:             ...             free(ptr);                   - patterns:           - pattern: |               if ($COND){                 ...                 free($PTR);                 ...               }               ...               free($PTR);           - pattern-not: |               if ($COND){                 ...                 free($PTR);                 ...                 $PTR = $EXPR;                 ...               }               ...               free($PTR);           - pattern-not: |               if ($COND){                 ...                 free($PTR);                 ...               }               ...               $PTR = $EXPR;               ...               free($PTR);       - patterns:         - pattern-inside: |             $FTYPE $FUNC(..., $TYPE $ARG, ...){               ...               free($ARG);               ...             }             ...         - pattern-not-inside: |             $FTYPE $FUNC(..., $TYPE $ARG, ...){               ...               free($ARG);               ...               $ARG = $EXPR;               ...             }             ...         - pattern: |                             $FUNC(..., $PTR, ...);             ...             $FUNC(..., $PTR, ...);         - pattern-not: |             $FUNC(..., $PTR, ...);             ...             $PTR = $EXPR;             ...             $FUNC(..., $PTR, ...);       - patterns:           - pattern: |               delete [] $PTR;               ...               delete [] $PTR;           - pattern-not: |               delete [] $PTR;               ...               $PTR = $EXPR;               ...               delete [] $PTR;       - patterns:           - pattern: |               delete $PTR;               ...               delete $PTR;           - pattern-not: |               delete $PTR;               ...               $PTR = $EXPR;               ...               delete $PTR;<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">semgrep --config config.yaml [PATH\/TO\/SRC]<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">Findings:           13\u2506 free(buf1);          14\u2506 free(buf1);           \u22ee\u2506----------------------------------------          38\u2506 free(buf2);          39\u2506           40\u2506 buf3 = (char *) malloc(SIZE);          41\u2506 free(buf2);           \u22ee\u2506----------------------------------------          56\u2506 wrapper(buf1);          57\u2506 wrapper(buf1);           \u22ee\u2506----------------------------------------          66\u2506 if (condition){          67\u2506    free(ptr);          68\u2506 }          69\u2506 free(ptr);           \u22ee\u2506----------------------------------------          66\u2506 if (condition){          67\u2506    free(ptr);          68\u2506 }          69\u2506 free(ptr);          70\u2506 free(ptr);           \u22ee\u2506----------------------------------------          69\u2506 free(ptr);          70\u2506 free(ptr);           \u22ee\u2506----------------------------------------          88\u2506 delete [] x;          89\u2506 delete [] x;           \u22ee\u2506----------------------------------------         113\u2506     free(ptr);         114\u2506     goto free_me;         115\u2506          116\u2506 free_me:         117\u2506     free(ptr);  Ran 1 rule on 3 file: 8 findings.<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436, \u0432 \u044d\u0442\u043e\u043c \u0438 \u0435\u0441\u0442\u044c \u0441\u0438\u043b\u0430 Semgrep! \u0411\u044b\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432\u0441\u0435 \u043a\u0435\u0439\u0441\u044b \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u0412\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u0434\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0438 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043b\u0438 \u0442\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435\u0442. \u042d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c, \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0430\u0441 \u043d\u0435 \u043e\u0431\u0440\u0430\u0434\u0443\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430 double-free, \u0430 \u0442\u0430\u043a\u0438\u0445 \u043a\u0435\u0439\u0441\u043e\u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u041f\u0440\u043e\u0431\u0443\u0439\u0442\u0435, \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438, \u0438 \u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u0442\u0438 \u0441 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. <\/p>\n<p>  <\/p>\n<p>Semgrep, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e \u0441\u0435\u0431\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 AppSec \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043d\u0430\u0448 \u043e\u0431\u0437\u043e\u0440 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u2014 CodeQL.<\/p>\n<p>  <\/p>\n<h3 id=\"codeql\">CodeQL<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/de\/n0\/fe\/den0fen1aqindhezzxcsvagxnr0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/de\/n0\/fe\/den0fen1aqindhezzxcsvagxnr0.png\"\/><\/div>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/github\/codeql\">CodeQL<\/a> \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Semmle\">Semmle<\/a> \u0432 2018 \u0433\u043e\u0434\u0443. \u0411\u044b\u0432\u0430\u043b\u044b\u0435 \u0440\u0435\u0441\u0435\u0447\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a <a href=\"https:\/\/msrc-blog.microsoft.com\/2018\/08\/16\/vulnerability-hunting-with-semmle-ql-part-1\/\">SemmleQL<\/a>. \u041e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0431\u044b\u043b \u0432\u044b\u043a\u0443\u043f\u043b\u0435\u043d GitHub \u0438 \u0441 2020 \u0433\u043e\u0434\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 Microsoft. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 CodeQL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043b\u0443\u0447\u0448\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DataFlow-\u0430\u043d\u0430\u043b\u0438\u0437\u0430\/Taint tracking \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (AST) \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, CFG (Control Flow Graph) \u0438 DataFlow \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0430. <\/p>\n<p>  <\/p>\n<p>\u041e CodeQL \u0443\u0436\u0435 \u0431\u044b\u0432\u0430\u043b\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0445 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0430\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ZeroNights 2021 \u2014 <a href=\"https:\/\/www.youtube.com\/watch?v=JK8uUKjo_ag&amp;ab_channel=ZeroNights\">&#171;Company wide SAST&#187;<\/a>), \u043e \u043d\u0435\u043c \u043d\u0435 \u0440\u0430\u0437 \u043f\u0438\u0441\u0430\u043b\u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/habr.com\/ru\/company\/swordfish_security\/blog\/541554\/\">CodeQL: SAST \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 (\u0438 \u0433\u043e\u043b\u043e\u0432\u043e\u0439)<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/566716\/\">\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 C++ \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GitHub Actions<\/a>), \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u0438 \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/codeql.github.com\/docs\/codeql-overview\/supported-languages-and-frameworks\/\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438<\/a>: C\/C++, C#, Go, Java, JavaScript, Python, Ruby, TypeScript<\/li>\n<li>\u0423\u0434\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0432 Visual Studio Code \u2014 <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=GitHub.vscode-codeql\">CodeQL extension<\/a><\/li>\n<li>\u041d\u0435\u043f\u043b\u043e\u0445\u0430\u044f <a href=\"https:\/\/codeql.github.com\/docs\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 <a href=\"https:\/\/help.semmle.com\/QL\/ql-training\/cpp\/global-data-flow-cpp.html#1\">\u043b\u0435\u043a\u0446\u0438\u0438<\/a> \u043e\u0442 Semmle<\/li>\n<li>\u041a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 DataFlow\/TaintTracking <\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (object-oriented queries)<\/li>\n<li>\u0412 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0432\u043e\u0440\u043a\u0448\u043e\u043f\u044b \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0438\u043d\u0442\u0440\u043e \u043a\u0430\u043a \u043e\u0442 <a href=\"https:\/\/securitylab.github.com\/ctf\/uboot\/\">\u0441\u0430\u043c\u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439<\/a>, \u0442\u0430\u043a \u0438 \u043e\u0442 <a href=\"https:\/\/jorgectf.github.io\/blog\/post\/practical-codeql-introduction\/\">\u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438<\/a><\/li>\n<li>\u0412 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u043e\u043d\u0441\u043e\u043b\u0438 <a href=\"https:\/\/lgtm.com\/help\/lgtm\/about-lgtm\">LGTM<\/a> (Looks Good To Me) \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0421odeQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0431\u0430\u0437\u0430\u043c opensource-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u043e\u0441\u0442\u044c, \u0447\u0442\u043e LGTM \u0437\u0430\u044f\u0432\u043b\u044f\u0435\u0442 \u043e \u0441\u0432\u043e\u0435\u043c <a href=\"https:\/\/github.blog\/2022-08-15-the-next-step-for-lgtm-com-github-code-scanning\/\">\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438<\/a> \u043a \u043a\u043e\u043d\u0446\u0443 2022 \u0433\u043e\u0434\u0430 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GitHub Code Scanning<\/li>\n<li>\u0421\u043f\u0438\u0441\u043e\u043a \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, <a href=\"https:\/\/medium.com\/csg-govtech\/hunting-bugs-in-accel-ppp-with-codeql-8370e297e18f\">\u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e CodeQL<\/a>, \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b <\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0433\u043e\u0442\u043e\u0432 \u043a \u0441\u0431\u043e\u0440\u043a\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d, CodeQL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Semgrep, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043b\u0435\u0442\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u0441 CodeQL \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. <\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0431\u0430\u0437\u0435<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0443. \u0415\u0441\u043b\u0438 \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u0432\u0435\u043b\u0438\u043a\u0430, \u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0434\u043e\u043b\u0433\u043e, \u0447\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u0421 \u0431\u0430\u0437\u043e\u0439 \u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0433 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043e \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u0447\u0430\u0441\u043e\u0432. \u0418\u043d\u043e\u0433\u0434\u0430 taint-\u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u043b\u0441\u044f \u0438 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0442\u0435\u0439.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, Github \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CodeQL \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0431\u0430\u0437 \u0432 \u0440\u044f\u0434\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/securitylab.github.com\/tools\/codeql\/license\">GitHub CodeQL Terms and Conditions<\/a>.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041c\u0438\u0441\u0442\u0438\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 DataFlow \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f, \u0434\u0430\u0436\u0435 \u0443 taint-\u0434\u0432\u0438\u0436\u043a\u0430 CodeQL. \u041f\u043e\u0440\u043e\u0439 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u043e\u0434\u044b taint-\u043f\u0443\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043d\u0443\u0448\u0430\u044e\u0442 \u0434\u043e\u0432\u0435\u0440\u0438\u044f, \u0438 \u0447\u0430\u0441\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0443\u0442\u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"320\" height=\"150\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lf\/lo\/jy\/lflojy7pnkmhkfrxk1pvdyqhtpg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/lf\/lo\/jy\/lflojy7pnkmhkfrxk1pvdyqhtpg.png\"\/><\/div>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0421odeQL \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u043a\u043e\u0434\u043e\u043c, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">codeql database create my_db --language=cpp<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0435\u0435 \u0432 VSCode \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u0431\u0430\u0433. \u0412 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 CodeQL \u0435\u0441\u0442\u044c \u0440\u044f\u0434 <a href=\"https:\/\/github.com\/github\/codeql\/tree\/main\/cpp\/ql\/src\">\u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/a> \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 <a href=\"https:\/\/github.com\/github\/codeql\/blob\/bbd7e623418e41775c90cfbbe44ad25b3bf9c5e3\/cpp\/ql\/src\/experimental\/Security\/CWE\/CWE-415\/DoubleFree.ql\">\u0442\u0430\u043a\u0438\u0445<\/a> \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0442\u0438\u043f\u0430 double-free. \u0412\u043e\u0442, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"250\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sw\/1h\/w-\/sw1hw-vx-vlpjuoqeugstgpvm1y.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sw\/1h\/w-\/sw1hw-vx-vlpjuoqeugstgpvm1y.png\"\/><\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b double-delete, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434-\u043e\u0431\u0435\u0440\u0442\u043a\u0443 <code>wrapper<\/code>. \u0414\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 CodeQL \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0448 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0449\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e double-delete \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043c\u0430\u043a\u0435\u0442 CodeQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">import &lt;language> import &lt;deps_you_need>    from \/* ... variable declarations ... *\/ where \/* ... logical formulas ... *\/ select \/* ... expressions ... *\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 <a href=\"https:\/\/codeql.github.com\/codeql-standard-libraries\/cpp\/semmle\/code\/cpp\/exprs\/Call.qll\/type.Call%24FunctionCall.html\">FunctionCall<\/a> \u0438 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>getTarget()<\/code> \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u0430\u043a \u043e\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442;<\/li>\n<li><code>getAPredecessor()<\/code> \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043a\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u043d\u043e\u0434\u044b \u043f\u043e\u0442\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import cpp  from FunctionCall fc, FunctionCall fc2 where  fc.getTarget().hasName(\"operator delete[]\") and fc2.getTarget().hasName(\"operator delete[]\") and fc != fc2 and fc.getAPredecessor*() = fc2 select fc, \"Double-delete $@ and $@\", fc2, \"here\", fc, \"and here\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u0441 \u043e\u0431\u0440\u0430\u0434\u0443\u0435\u0442 \u2014 CodeQL \u043d\u0430\u0439\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 double-delete, \u043a\u0430\u043a \u043c\u044b \u0438 \u0445\u043e\u0442\u0435\u043b\u0438:<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"115\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/bh\/1w\/9m\/bh1w9mhulfso9jkswvnrhn2y77k.png\" data-src=\"https:\/\/habrastorage.org\/webt\/bh\/1w\/9m\/bh1w9mhulfso9jkswvnrhn2y77k.png\"\/><\/div>\n<p>  <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c taint tracking \u0438 \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e double-free, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043c\u043e\u0436\u0435\u043c. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>semmle.code.cpp.dataflow.TaintTracking<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 taint-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 <code>DataFlow::PathGraph<\/code> \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439. <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">taint.ql<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"sql\">\/**  * @name Double free  * @kind path-problem  * @id double-free  *\/  import cpp  import semmle.code.cpp.dataflow.TaintTracking import DataFlow::PathGraph  class Config extends TaintTracking::Configuration {     Config() {this = \"Double free\"}      override predicate isSource(DataFlow::Node source) {         exists(FunctionCall call |                    source.asDefiningArgument() = call.getArgument(0)            and           call.getTarget().hasGlobalOrStdName(\"free\")                            )       }           override predicate isSink(DataFlow::Node sink) {         exists(FunctionCall call |              call.getTarget().hasGlobalOrStdName(\"free\")               and               sink.asExpr() = call.getArgument(0)           )                       } }  from Config config, DataFlow::PathNode source, DataFlow::PathNode sink where config.hasFlowPath(source, sink) select sink, source, sink, \"Memory is $@ and $@, causing a potential vulnerability.\", source, \"freed here\", sink, \"here\"<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u043e. \u0417\u0430\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0448\u0435\u043b \u0432\u044b\u0437\u043e\u0432 <code>free<\/code> \u0432 \u043c\u0435\u0442\u043e\u0434\u0435-\u043e\u0431\u0435\u0440\u0442\u043a\u0435 \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043b \u043f\u0443\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0447\u0430\u043d\u043a) \u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043a \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"250\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4t\/ep\/d4\/4tepd4usm3n3_xxvawujifxflvo.png\" data-src=\"https:\/\/habrastorage.org\/webt\/4t\/ep\/d4\/4tepd4usm3n3_xxvawujifxflvo.png\"\/><\/div>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e CodeQL \u0432\u044b\u0434\u0430\u043b \u043e\u0434\u0438\u043d false-positive \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u0435\u0439\u0441\u0435 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>reassignment(char *ptr)<\/code>, \u0433\u0434\u0435 \u043f\u043e\u0438\u043d\u0442\u0435\u0440 \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0447\u0430\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u043a\u0443\u0447\u0438 \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u0437\u0438\u043d\u044b. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 <code>isSanitizer<\/code> taint-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u043e \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a taint path \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u0432 \u0441\u0435\u0431\u044f \u0432\u044b\u0437\u043e\u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0437\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, CodeQL \u2014 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0433\u0434\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a \u0431\u0430\u0437\u0435. CodeQL \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f Valtteri Rahkonen <a href=\"https:\/\/blog.fraktal.fi\/sast-tool-comparison-95df4a9647f2\">&#171;SAST Tool Comparison Using Secure C Coding Standard Examples&#187;<\/a>, \u0433\u0434\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0440\u044f\u0434 open-source \u0438 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, CodeQL \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u0430\u0431\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043b\u043e\u0445\u043e\u0439 \u043d\u043e\u0442\u0435. CodeQL \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0441\u0442\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e CVE, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e.<\/p>\n<p>  <\/p>\n<h3 id=\"weggli\">Weggli<\/h3>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/googleprojectzero\/weggli\">Weggli<\/a> \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0431\u0430\u0437\u0430\u0445 \u043d\u0430 C\/C++. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c Felix Wilhelm \u0438\u0437 Google Project Zero \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u043e\u0441\u0435\u043d\u044c\u044e 2021 \u0433\u043e\u0434\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u043c\u043e\u0447\u044c \u0440\u0435\u0441\u0435\u0447\u0435\u0440\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0431\u0430\u0437\u0430\u0445. &#171;Killer feature&#187; \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c C\/C++ \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0445 \u0441\u0431\u043e\u0440\u043a\u0438, \u0432 \u0447\u0435\u043c \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 Semgrep. <\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e Weggli \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e Weggli \u043e\u0442 \u043f\u0430\u0440\u043e\u0447\u043a\u0438 \u0431\u044b\u0432\u0430\u043b\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 CodeQL, <a href=\"https:\/\/dustri.org\/b\/playing-with-weggli.html\">&#171;Playing with Weggli&#187;<\/a>, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 Weggli \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c <a href=\"https:\/\/github.com\/p4zuu\/weggli-examples\/tree\/master\/linux-kernel\/double-free\">github-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043d\u044f\u0442\u043d\u043e\u0433\u043e Weggli-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 double-free \u0432 \u044f\u0434\u0440\u0435 Linux. \u041c\u044b \u0442\u043e\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041d\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li>\u041f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 C \u0438 C++<\/li>\n<li>\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <\/li>\n<li>\u041c\u0430\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0442 \u043a\u043e\u043c\u044c\u044e\u043d\u0438\u0442\u0438 \u0438 \u0438\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430<\/li>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439\/\u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438<\/li>\n<li>\u041d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0432 Control Flow<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 Weggli, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>$func<\/code> \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/li>\n<li><code>$ptr<\/code> \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 double-free<\/li>\n<li><code>NOT<\/code> \u2014 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e<\/li>\n<li><code>_<\/code> \u2014 \u043b\u044e\u0431\u0430\u044f AST-\u043d\u043e\u0434\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 double-free \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">weggli --cpp -R '$func=free' '{ $func($ptr); NOT: $ptr = _; NOT: return; $func($ptr); }' ~\/project<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">funcs.cpp:9 void double_free() {     char *buf1;     buf1 = (char *) malloc(SIZE);        **free(buf1);**     **free(buf1);** } funcs.cpp:29 void df_by_pointer() { ..     char *buf3;      buf1 = (char *) malloc(SIZE);     buf2 = (char *) malloc(SIZE);     free(buf1);      **free(buf2);**      buf3 = (char *) malloc(SIZE);        **free(buf2);**     free(buf3); } funcs.cpp:61 void conditional_dfree() {     int condition = 1;     char *ptr;     ptr = (char *) malloc(SIZE);     if (condition)          **free(ptr);**      **free(ptr);**     free(ptr); } funcs.cpp:61 void conditional_dfree() {     int condition = 1;     char *ptr;     ptr = (char *) malloc(SIZE);     if (condition)          free(ptr);      **free(ptr);**     **free(ptr);** } funcs.cpp:61 void conditional_dfree() { ..     char *ptr;     ptr = (char *) malloc(SIZE);     if (condition)          **free(ptr);**      free(ptr);     **free(ptr);** \/\/ \u042d\u0442\u043e \u043f\u0440\u044f\u043c \u043d\u0435\u0447\u0442\u043e! } funcs.cpp:99 void intrnl_reassignment() {     char *ptr;     ptr = (char *) malloc(SIZE);     **free(ptr);**     reassignment(ptr);     **free(ptr);** } funcs.cpp:109 void bad_goto() {     char *ptr;     ptr = (char *) malloc(SIZE);     **free(ptr);**     goto free_me;  free_me:     **free(ptr);**     return; }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>Weggli, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c, \u043d\u0435 \u0441\u043c\u043e\u0433 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b double-free \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 <code>wrapper<\/code>, \u0432\u044b\u0434\u0430\u043b false-positive \u0441 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>reassignment<\/code> \u0438 \u0443\u043b\u044b\u0431\u043d\u0443\u043b \u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u043a\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">if (condition)    **free(ptr);** \/\/ first free  free(ptr); **free(ptr);** \/\/ second free, \u044d\u0442\u043e \u043f\u0440\u044f\u043c \u043d\u0435\u0447\u0442\u043e!<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 double-delete \u2014 \u0438 Weggli \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c, \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u0442 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0435\u0439\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">weggli --cpp 'delete $a; NOT: $a = _; delete $a' ~\/project<\/code><\/pre>\n<p>  <\/p>\n<p>Weggli \u2014 \u043c\u043e\u043b\u043e\u0434\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043f\u043e\u043a\u0430 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0448\u0438\u0440\u043e\u043a\u0430, \u043a\u0430\u043a \u0443 Semgrep \u0438\u043b\u0438 CodeQL, \u043d\u043e \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043d\u0438\u0435. \u0416\u0434\u0435\u043c \u043e\u0442 \u0424\u0435\u043b\u0438\u043a\u0441\u0430 \u043d\u043e\u0432\u044b\u0445 \u0438\u0434\u0435\u0439 \u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439!<\/p>\n<p>  <\/p>\n<h3 id=\"joern\">Joern<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"200\" height=\"230\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/3e\/p6\/xf\/3ep6xfbnmv0la8xvr6tenfgn5vg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/3e\/p6\/xf\/3ep6xfbnmv0la8xvr6tenfgn5vg.png\"\/><\/div>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/joernio\/joern\">Joern<\/a> \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043e\u0442 <a href=\"https:\/\/www.shiftleft.io\/\">ShiftLeft<\/a>. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Scala, \u0430 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 CPGQL, \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (\u0442\u0430\u043a\u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 Scala), \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 CPG (code property graph). CPG \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Joern \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043e\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0438\u043c, \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u0430\u043c\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u2014 <a href=\"https:\/\/www.sec.cs.tu-bs.de\/pubs\/2014-ieeesp.pdf\">&#171;Modeling and Discovering Vulnerabilities with Code Property Graphs&#187;<\/a>. CPG \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f AST \u043f\u0440\u043e\u0435\u043a\u0442\u0430, Control Flow \u0433\u0440\u0430\u0444, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u0438\u043d\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e CPG \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/github.com\/ShiftLeftSecurity\/codepropertygraph\">github-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 ShiftLeft<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/fabsx00\/joern-old\">\u043f\u0440\u0435\u0434\u043e\u043a Joern<\/a> \u0441\u043e \u0441\u0445\u043e\u0436\u0435\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 CPG \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u0432 \u0434\u0430\u043b\u0435\u043a\u043e\u043c 2012 \u0433\u043e\u0434\u0443 \u0438 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 ACSAC&#8217;12 (Annual Computer Security Applications Conference) \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c <a href=\"https:\/\/fabianyamaguchi.com\/\">Fabian Yamaguchi<\/a> \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0442\u0442\u0438\u043d\u0433\u0435\u043d\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430. CPG \u043f\u0440\u0435\u0436\u043d\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f \u0432 \u0433\u0440\u0430\u0444\u043e\u0432\u043e\u0439 \u0421\u0423\u0411\u0414 <a href=\"https:\/\/neo4j.com\/\">Neo4J<\/a> (\u0432 \u043d\u043e\u0432\u043e\u043c Joern \u0437\u0430\u043c\u0435\u043d\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/ShiftLeftSecurity\/overflowdb\">OverflowDB<\/a>), \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u043b <a href=\"https:\/\/tinkerpop.apache.org\/gremlin.html\">Gremlin<\/a>. \u041d\u0430 \u0441\u0432\u043e\u0435\u043c \u0432\u0435\u043a\u0443 Joern-old \u0443\u0441\u043f\u0435\u043b \u043e\u0431\u0436\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 <a href=\"http:\/\/web.archive.org\/web\/20180319074427\/http:\/\/mlsec.org\/joern\/wallofbugs.shtml\">TrophyCase<\/a> \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 CVE. \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u044f\u0434 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0433\u043e\u0434\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u044f\u0432\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u043e\u0442 Joern, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Joern \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u044f taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u042d\u0442\u0430 \u043c\u044b\u0441\u043b\u044c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/jaiverma.github.io\/blog\/joern-uboot\">\u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439<\/a> \u043e Joern, \u0433\u0434\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 CodeQL \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e <a href=\"https:\/\/securitylab.github.com\/ctf\/uboot\/\">CodeQL U-Boot challenge<\/a>. Joern \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u043b \u0432 \u044d\u0442\u043e\u043c &#171;\u0432\u0435\u0440\u0441\u0443\u0441\u0435&#187;, \u0438 \u043f\u043e\u0440\u043e\u0439 \u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c\u0438 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e Joern \u0445\u043e\u0440\u043e\u0448 \u043d\u0430 \u0434\u0435\u043b\u0435. \u041d\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 <strong>\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b<\/strong> Joern:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041e\u0442\u043b\u0438\u0447\u043d\u0430\u044f <a href=\"https:\/\/docs.joern.io\/home\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043a\u0430\u043a \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0441\u0430\u043c\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c, \u0442\u0430\u043a \u0438 \u043a <a href=\"https:\/\/docs.joern.io\/cpgql\/reference-card\">\u044f\u0437\u044b\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 CPGQL<\/a><\/li>\n<li>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li>\u0418\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/discord.com\/invite\/vv4MH284Hc\">Discord-\u0447\u0430\u0442<\/a> \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u043e\u043f\u044b\u0442\u043e\u043c<\/li>\n<li><a href=\"https:\/\/docs.joern.io\/home#supported-languages\">\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438<\/a>: C\/C++, Javascript, Kotlin, Python, Ghidra(x86\/x64), JVM bytecode, LLVM bitcode<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/li>\n<li>\u0412 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b <a href=\"https:\/\/queries.joern.io\/\">\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/a> \u043d\u0430 CPGQL \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u043f\u0443\u0441\u0442\u044c \u0438 \u043d\u0435 \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435<\/li>\n<li>\u041d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0434\u0435\u043b\u0430\u043d \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 <a href=\"https:\/\/docs.joern.io\/scan\">Joern Scan<\/a> \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/li>\n<li>\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438, <a href=\"https:\/\/docs.joern.io\/extensions\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e CPGQL, \u043d\u043e \u0438 \u043e\u0441\u043d\u043e\u0432 Scala, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/li>\n<li>Ruleset, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432\u0435\u043b\u0438\u043a <\/li>\n<li>\u041d\u0435 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0442.\u043a. \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CPG \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0439\u043d\u0435 \u0434\u043e\u043b\u0433\u0438\u043c \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445<\/li>\n<li>\u041e\u0448\u0438\u0431\u043a\u0438 \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0438\u0435 \u043a \u043b\u043e\u0436\u043d\u044b\u043c \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f\u043c. \u041a \u043d\u0438\u043c \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 double-free \u0438 double-delete. \u041f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>importCode<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u043d\u0435\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 CPG:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">     \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557   \u2588\u2588\u2557      \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2551      \u2588\u2588\u2551\u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588   \u2588\u2588\u2551\u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255d  \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u255a\u2588\u2588\u2557\u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551  \u2588\u2588\u2551\u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2551  \u255a\u2550\u2550\u2550\u2550\u255d  \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d  \u255a\u2550\u255d\u255a\u2550\u255d  \u255a\u2550\u2550\u2550\u255d Version: 1.1.1140 Type `help` or `browse(help)` to begin  joern> importCode(inputPath=\"\u043f\u0443\u0442\u044c_\u043a_\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\", projectName=\"\u0438\u043c\u044f_\u043f\u0440\u043e\u0435\u043a\u0442\u0430\") res1: Cpg = Cpg (Graph [67082 nodes])<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 <code>cpg<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c \u0432\u0441\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u043d\u0435\u043c\u0443 \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b <code>free<\/code> \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">cpg.call(\"free\").l.map(     call => (       call.id,       call.method.name,       call.code,       call.location.lineNumber match {         case Some(n) => n.toString         case None => \"n\/a\"         }     )   ) <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">res3: List[(Long, String, String, String)] = List(   (24797L, \"double_free\", \"free(buf1)\", \"13\"),   (24799L, \"double_free\", \"free(buf1)\", \"14\"),   (24812L, \"no_double_free\", \"free(ptr)\", \"22\"),   (24820L, \"no_double_free\", \"free(ptr)\", \"24\"),   (24844L, \"df_by_pointer\", \"free(buf1)\", \"37\"),   (24846L, \"df_by_pointer\", \"free(buf2)\", \"38\"),   (24854L, \"df_by_pointer\", \"free(buf2)\", \"41\"),   (24856L, \"df_by_pointer\", \"free(buf3)\", \"42\"),   (24863L, \"wrapper\", \"free(ptr)\", \"47\"),   (24901L, \"conditional_dfree\", \"free(ptr)\", \"67\"),   (24903L, \"conditional_dfree\", \"free(ptr)\", \"69\"),   (24905L, \"conditional_dfree\", \"free(ptr)\", \"70\"),   (24918L, \"free_null\", \"free(ptr)\", \"78\"),   (24923L, \"free_null\", \"free(ptr)\", \"80\"),   (24966L, \"intrnl_reassignment\", \"free(ptr)\", \"103\"),   (24970L, \"intrnl_reassignment\", \"free(ptr)\", \"105\"),   (24983L, \"bad_goto\", \"free(ptr)\", \"113\"),   (24987L, \"bad_goto\", \"free(ptr)\", \"117\"),   (25005L, \"good_goto\", \"free(ptr)\", \"127\"),   (25011L, \"good_goto\", \"free(ptr)\", \"131\") )<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>id<\/code> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>Long<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u043e\u0447\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0433\u0440\u0430\u0444\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (<code>cfgNode<\/code> \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 CPGQL). \u041e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0436\u0435 taint-\u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 double-free!<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">joern> run.ossdataflow \/\/ \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Joern v1.1.299 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d \u043a \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044e joern> def source = cpg.call(\"free\").argument joern> def sink = cpg.call(\"free\").argument joern> sink.reachableByFlows(source).filter(f => f.elements.size > 1).p<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u2014 <code>source<\/code> \u0438 <code>sink<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>free<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e \u043f\u0443\u0442\u0438 &#171;\u043f\u043e\u0440\u0447\u0438&#187;. \u042d\u0442\u0438\u043c \u0437\u0430\u0439\u043c\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 <code>reachableByFlows<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043a \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0443. <code>filter<\/code> (filter step) \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432 \u0433\u0440\u0430\u0444\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0435\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0443\u0431\u0435\u0440\u0435\u0442 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 &#171;\u043f\u0435\u0442\u043b\u0438&#187; (\u043f\u043e\u0442\u043e\u043a \u043e\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>free<\/code> \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435). \u0422\u0430\u043a\u043e\u0432\u044b \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Joern.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0445\u043b\u043e\u043f \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043f\u0440\u044f\u0442\u0430\u043d \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">res10: List[String] = List(   \"\"\"____________________________________________________ | tracked   | lineNumber| method   | file                | |========================================================| | free(ptr) | 113       | bad_goto | ~\/sources\/funcs.cpp | | free(ptr) | 117       | bad_goto | ~\/sources\/funcs.cpp | \"\"\",   \"\"\"_____________________________________________________________ | tracked   | lineNumber| method            | file                | |=================================================================| | free(ptr) | 67        | conditional_dfree | ~\/sources\/funcs.cpp | | free(ptr) | 69        | conditional_dfree | ~\/sources\/funcs.cpp | | free(ptr) | 70        | conditional_dfree | ~\/sources\/funcs.cpp | \"\"\",   \"\"\"_____________________________________________________________ | tracked   | lineNumber| method            | file                | |=================================================================| | free(ptr) | 69        | conditional_dfree | ~\/sources\/funcs.cpp | | free(ptr) | 70        | conditional_dfree | ~\/sources\/funcs.cpp | \"\"\",   \"\"\"__________________________________________________________ | tracked    | lineNumber| method        | file                | |==============================================================| | free(buf2) | 38        | df_by_pointer | ~\/sources\/funcs.cpp | | free(buf2) | 41        | df_by_pointer | ~\/sources\/funcs.cpp | \"\"\",   \"\"\"_____________________________________________________________________________ | tracked                 | lineNumber| method              | file                | |=================================================================================| | free(ptr)               | 103       | intrnl_reassignment | ~\/sources\/funcs.cpp | | reassignment(ptr)       | 104       | intrnl_reassignment | ~\/sources\/funcs.cpp | | reassignment(char *ptr) | 92        | reassignment        | ~\/sources\/funcs.cpp | | void                    | 92        | reassignment        | ~\/sources\/funcs.cpp | | reassignment(ptr)       | 104       | intrnl_reassignment | ~\/sources\/funcs.cpp | | free(ptr)               | 105       | intrnl_reassignment | ~\/sources\/funcs.cpp | \"\"\",   \"\"\"________________________________________________________ | tracked    | lineNumber| method      | file                | |============================================================| | free(buf1) | 13        | double_free | ~\/sources\/funcs.cpp | | free(buf1) | 14        | double_free | ~\/sources\/funcs.cpp | \"\"\",   \"\"\"_____________________________________________________________ | tracked   | lineNumber| method            | file                | |=================================================================| | free(ptr) | 67        | conditional_dfree | ~\/sources\/funcs.cpp | | free(ptr) | 69        | conditional_dfree | ~\/sources\/funcs.cpp | \"\"\" )<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u044f\u0434 \u043e\u0448\u0438\u0431\u043e\u043a. \u041d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e, \u043e\u043d \u0441\u043c\u043e\u0433 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u0435\u0439\u0441\u044b \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u0435\u0439\u0441\u044b \u0441 if-\u0431\u043b\u043e\u043a\u043e\u043c \u0438 goto, \u043d\u043e \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0441\u043b\u0443\u0447\u0430\u0439 \u0441 \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 <code>free<\/code> (\u0432\u044b\u0437\u043e\u0432\u044b <code>wrapper<\/code>), \u0432\u044b\u0434\u0430\u043b \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f (\u0432\u044b\u0437\u043e\u0432 <code>reassignment<\/code>). \u0418\u0441\u0441\u043b\u0435\u0434\u0443\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0442\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438:<\/p>\n<p>  <\/p>\n<p>1) \u0423 Joern \u043d\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 taint-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\/\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0441\u0435\u043a\u0446\u0438\u0438 &#171;Data-Flow Steps&#187; \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u043e\u0441\u044c \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043f\u0443\u0442\u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0414\u0430, \u044d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430\u043c\u0435\u043a \u043d\u0430 CodeQL \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u044b <code>isSanitizer<\/code> \u0438 <code>isBarrier<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>2) \u041b\u043e\u0436\u043d\u043e\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<p>Joern \u043d\u0435 \u0432\u044b\u0434\u0430\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>free<\/code> \u0432 \u043e\u0431\u0435\u0440\u0442\u043a\u0435, \u0438 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 taint-\u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>wrapper(buf1)<\/code> (funcs.cpp:56) \u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0443 <code>free<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">joern> def source = cpg.call.id(28247).argument   joern> def sink = cpg.call(\"free\").argument joern> sink.reachableByFlows(source).p<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\"> \"\"\"_______________________________________________________________________ | tracked            | lineNumber| method           | file                | |=========================================================================| | wrapper(buf1)      | 56        | df_with_wrappers | ~\/sources\/funcs.cpp | | wrapper(buf1)      | 57        | df_with_wrappers | ~\/sources\/funcs.cpp | | wrapper(char *ptr) | 45        | wrapper          | ~\/sources\/funcs.cpp | | free(ptr)          | 47        | wrapper          | ~\/sources\/funcs.cpp | \"\"\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, Joern \u0432\u0438\u0434\u0438\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 <code>free<\/code>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 double-free \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>3) \u041b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f (\u0432\u044b\u0437\u043e\u0432 <code>reassignment<\/code>) \u043d\u0430 \u043f\u0443\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 <code>free<\/code> \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u043e Joern \u0442\u0430\u043a \u043d\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b. \u0418\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435, \u043a\u0442\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043d\u0435\u0439. \u0411\u044b\u043b\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 <a href=\"https:\/\/github.com\/joernio\/joern\/issues\/1009\">issue &#171;Dataflow inconsistency related to reassignment and subcalls&#187;<\/a> \u0432 github-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Joern, \u0433\u0434\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0441\u0445\u043e\u0436\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0411\u0443\u0434\u0435\u043c \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e taint-\u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<p>  <\/p>\n<p>\u041b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e Joern \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u043f\u043e \u043a\u0430\u043a\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u0437\u043d\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u043d \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0434\u0432\u043e\u0439\u043d\u044b\u0445 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 <code>conditional_dfree()<\/code>. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u043c\u0435\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u0435\u0439\u0441, \u043a\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">bool res = 1; free(ptr); if (res){   goto goodbye; } free(ptr); \/\/ \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c<\/code><\/pre>\n<p>  <\/p>\n<p>Joern \u0431\u044b \u043e\u0442\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0435\u0442, \u0445\u043e\u0442\u044f \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043e\u0442\u0432\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u0435\u043d. \u0423\u043b\u043e\u0432\u043a\u0430 \u0431\u044b \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0431\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445. <\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043e\u043c\u043d\u0435\u043d\u043d\u043e, taint-\u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u0438\u043c\u0435\u0435\u0442\u0441\u044f. \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043d\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0442\u0430\u043a, \u043a\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 CPGQL \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a taint-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c Joern. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u0443 \u043d\u0430\u0441 \u0432 \u0440\u0443\u043a\u0430\u0445 \u0441\u0430\u043c CPG! \u0412\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0438\u0434\u0438\u043c (\u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c) \u043e\u0448\u0438\u0431\u043a\u0443 double-free \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0442\u0435\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0435\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0430\u0432\u0438\u043b\u043e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"scala\">import scala.collection.mutable.Map import scala.collection.mutable.ListBuffer import scala.util.control.Breaks._  var result = new ListBuffer[Call]() var preparedCalls = Map[String, Int]()  def do_job(call:Call, argIndex:Int, otherCalls:Map[Call, Int]): Unit = {    val localArgDeclCall = call.argument.argumentIndex(argIndex).isIdentifier.refsTo.id.head   val sameArgDeclCalls = otherCalls.filter(x =>   x._1.argument.argumentIndex(x._2).isIdentifier.refsTo.id.head == localArgDeclCall).toSet    if (sameArgDeclCalls.isEmpty){      return    }    for (suspectCall &lt;- sameArgDeclCalls){     val assignList = suspectCall._1.postDominatedBy.assignment     .filter(_.id &lt; call.id)     .filter(_.argument.isIdentifier.name.head.equals(call.argument(argIndex).code))     if (suspectCall._1.id &lt; call.id &amp;&amp; assignList.isEmpty){       val innerCalls = suspectCall._1.postDominatedBy.isCall.filter(_.id &lt;= call.id).toSetMutable       if (innerCalls.contains(call)){         innerCalls -= call         if (innerCalls.isEmpty) {           result += call           return         }         else {           var argUsage = false           for (innerCall &lt;- innerCalls) {             breakable {               var arg_idx = 0               for (arg &lt;- innerCall.argument.isIdentifier) {                 if (arg.refsTo.id.head.equals(localArgDeclCall)) {                   arg_idx = arg.argumentIndex                 }               }               if (arg_idx == 0){                 break               }               val ptr_name = cpg.method(innerCall.name).parameter.index(arg_idx).name               val innerAssignments = cpg.method(innerCall.name).postDominatedBy.assignment.argument.isIdentifier.name.toList               if (innerAssignments.contains(ptr_name.head)){                 argUsage = true                 return               }             }           }           if (!argUsage) {             result += call             return           }         }       }     }   } }  preparedCalls += (\"free\" -> 1) for (call &lt;- cpg.call(\"free\")){   val arg_name = call.argument(1).code   val localAssignments = call.method.postDominatedBy.assignment   .filter(x => arg_name.contains(x.argument.isIdentifier.code))   if (localAssignments.isEmpty){     for (arg &lt;- call.method.parameter.toList){       if (arg_name.contains(arg.name)){         preparedCalls += (call.method.name -> arg.index)       }     }   } } for ((methodName, argIndex) &lt;- preparedCalls){   for (call &lt;- cpg.call(methodName)){     val otherCalls = Map[Call, Int]()     for ((name, index) &lt;- preparedCalls){       for (chosenOne &lt;- cpg.call(name).filter(_.id != call.id).toList){         otherCalls += (chosenOne -> index)       }     }     do_job(call, argIndex, otherCalls)   } } result.l.map(     call => (         call.method.name,         call.code,         call.location.lineNumber match {            case Some(n) => n.toString            case None => \"n\/a\"         }     ) )<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0412 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442. \u041e\u043d\u043e \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u0435\u0439\u0441\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b <code>free<\/code> \u0438 \u0447\u0438\u0441\u0442\u044b\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u043d\u0438\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044e, \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u0418\u0441\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 (\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0435\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c) \u0432 \u043c\u0435\u0442\u043e\u0434\u0435. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0441\u0442\u044c \u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0421\u0430\u043c\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u0441\u0442\u0430\u0442\u0438, \u0432 CPG \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043a\u0430\u043a \u0432\u044b\u0437\u043e\u0432 <code>&lt;operator>.assignment<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">res20: List[operatorextension.OpNodes.Assignment] = List(   Call(     id -> 28159L,     argumentIndex -> -1,     argumentName -> None,     code -> \"buf1 = (char *) malloc(SIZE)\",     columnNumber -> Some(value = 2),     dispatchType -> \"STATIC_DISPATCH\",     dynamicTypeHintFullName -> ArraySeq(),     lineNumber -> Some(value = 12),     methodFullName -> \"&lt;operator>.assignment\",     name -> \"&lt;operator>.assignment\",     order -> 2,     signature -> \"\",     typeFullName -> \"&lt;empty>\"   ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u0432\u0441\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043b\u0438\u0441\u0442 \u0438 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">res102: List[(String, String, String)] = List(   (\"df_with_wrappers\", \"wrapper(buf1)\", \"57\"),   (\"double_free\", \"free(buf1)\", \"14\"),   (\"df_by_pointer\", \"free(buf2)\", \"41\"),   (\"conditional_dfree\", \"free(ptr)\", \"69\"),   (\"conditional_dfree\", \"free(ptr)\", \"70\"),   (\"bad_goto\", \"free(ptr)\", \"117\") )   <\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u043e! \u041d\u0430\u0439\u0434\u0435\u043d\u044b \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u0435\u0439\u0441\u043e\u0432 \u043d\u0435\u0442. \u0420\u0443\u0447\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 CPG \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u043e\u0439 \u0438 \u0434\u0430\u043b\u0430 \u0441\u0432\u043e\u0438 \u043f\u043b\u043e\u0434\u044b. <\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e double-delete \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>reachableByFlows<\/code>, \u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>&lt;operator>.delete<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"scala\">\"\"\"______________________________________________________________ | tracked     | lineNumber| method        | file                | |===============================================================| | delete [] x | 88        | double_delete | ~\/sources\/funcs.cpp | | delete [] x | 89        | double_delete | ~\/sources\/funcs.cpp | \"\"\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b! \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e Joern \u2014 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445\/\u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043f\u043e \u043e\u0431\u044a\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u043e\u043c, \u0437\u0430\u0434\u0443\u043c\u043a\u043e\u0439, \u043d\u0435 \u0431\u0435\u0437 \u0438\u0437\u044a\u044f\u043d\u043e\u0432, \u043d\u043e \u0441 \u043a\u0440\u0435\u043f\u043a\u043e\u0439 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043e\u0439. Joern \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f CPG\/CFG, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0447\u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u0435. \u0414\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0437\u0434\u043e\u0440\u043e\u0432\u043e. <\/p>\n<p>  <\/p>\n<h3 id=\"mate\">MATE<\/h3>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"200\" height=\"120\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ek\/jz\/7i\/ekjz7iafwv-p86dtxv5uw6twkza.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ek\/jz\/7i\/ekjz7iafwv-p86dtxv5uw6twkza.png\"\/><\/div>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/GaloisInc\/MATE\">MATE<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f C\/C++ \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0412 \u044d\u0442\u043e\u043c \u043e\u0431\u0437\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0439 toolset \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c\u043d\u043e\u0439 \u043b\u043e\u0448\u0430\u0434\u043a\u043e\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <a href=\"https:\/\/galois.com\/\">Galois<\/a> \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 DARPA. \u0420\u0435\u043b\u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043b\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043b\u0435\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430, \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0435\u0449\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043e\u0431\u0440\u0430\u0441\u0442\u0438 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b, \u0432\u043e\u0440\u043a\u0448\u043e\u043f\u0430\u043c\u0438 \u0438 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u0444\u0438\u0434\u0431\u0435\u043a\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b MATE \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a, \u0442\u0430\u043a\u0438\u043c \u0448\u0438\u0440\u043e\u043a\u0438\u043c \u043a\u0440\u0443\u0433\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 MATE \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0438 Joern, MATE \u0432 \u0441\u0432\u043e\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0433\u0440\u0430\u0444 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u043e\u0434\u0430 (CPG). \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a CPG MATE \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Python \u0438 <a href=\"https:\/\/www.sqlalchemy.org\/\">SQLAlchemy<\/a>. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/galoisinc.github.io\/MATE\/quickstart.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 MATE<\/a>, CPG-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (AST)<\/li>\n<li>\u0433\u0440\u0430\u0444 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 (CG)<\/li>\n<li>\u0433\u0440\u0430\u0444 \u043f\u043e\u0442\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (CFG)<\/li>\n<li>\u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u043f\u043e\u0442\u043e\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (ICFG)<\/li>\n<li>\u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (DFG)<\/li>\n<li>\u0433\u0440\u0430\u0444 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (CDG)<\/li>\n<li>points-to graph (PTG)<\/li>\n<li>\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 LLVM<\/li>\n<li>memory layout<\/li>\n<li>\u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f DWARF<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"https:\/\/galoisinc.github.io\/MATE\/overview.html#comparison-to-related-tools\">\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f<\/a> MATE \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0436\u0435 \u043f\u043e\u0431\u044b\u0432\u0430\u043b\u0438 \u0432 \u043e\u0431\u0437\u043e\u0440\u0435, \u0441 <a href=\"https:\/\/galoisinc.github.io\/MATE\/overview.html#limitations\">\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 MATE<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435. \u0421\u0430\u043c\u044b\u043c \u0432\u0430\u0436\u043d\u044b\u043c \u0438\u0437 \u043d\u0438\u0445, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 MATE \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 LLVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0441 clang.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0435\u043b\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c MATE:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/galoisinc.github.io\/MATE\/cli-overview.html\">mate-cli<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 <a href=\"https:\/\/galoisinc.github.io\/MATE\/using-rest-api.html\">MATE REST API<\/a>. \u0422\u043e\u0447\u043a\u0430 \u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435 MATE \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">mate-cli oneshot -p ~\/sources\/<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (<a href=\"http:\/\/localhost:3000\/builds\">http:\/\/localhost:3000\/builds<\/a>) \u0438 \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/i0\/3q\/xr\/i03qxrlutfsn5xtlymls-i94nrw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/i0\/3q\/xr\/i03qxrlutfsn5xtlymls-i94nrw.png\"\/><\/div>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/galoisinc.github.io\/MATE\/pois.html\">\u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b POIs<\/a> (Points of Interest)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a command injection, path traversal, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0446\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b MATE \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435. <\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/y9\/fi\/9n\/y9fi9nuy48ni68zbw6r5htwqkpe.png\" data-src=\"https:\/\/habrastorage.org\/webt\/y9\/fi\/9n\/y9fi9nuy48ni68zbw6r5htwqkpe.png\"\/><\/div>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/galoisinc.github.io\/MATE\/tutorial-flowfinder.html\">Flowfinder<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 Flowfinder \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 CPG \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c. \u0418\u0433\u0440\u0430\u0435\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u0430\u043a \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 POI, \u0442\u0430\u043a \u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5z\/cu\/g8\/5zcug8wuvdac08kc33c3wp5-0wo.png\" data-src=\"https:\/\/habrastorage.org\/webt\/5z\/cu\/g8\/5zcug8wuvdac08kc33c3wp5-0wo.png\"\/><\/div>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/galoisinc.github.io\/MATE\/under-constrained-manticore.html\">Manticore \u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/trailofbits\/manticore\">Manticore<\/a> \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e \u043e\u0442 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\/\u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 Manticore \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043f\u043e\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043c\u043e\u0436\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f. \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <a href=\"https:\/\/galoisinc.github.io\/MATE\/under-constrained-manticore.html#specifying-additional-symbolic-constraints\">&#171;Specifying additional symbolic constraints&#187;<\/a> \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/galoisinc.github.io\/MATE\/usagefinder.html\">UsageFinder<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>UsageFinder \u2014 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 Jupyter Notebook \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0442\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, UsageFinder \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>df_by_pointer()<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0438\u0434\u043d\u044b \u0434\u0432\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>free<\/code> \u0441 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c (\u0437\u0435\u043b\u0435\u043d\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430):<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"270\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/r9\/qk\/j8\/r9qkj8dng-nig1h2f7eyqntlu_s.png\" data-src=\"https:\/\/habrastorage.org\/webt\/r9\/qk\/j8\/r9qkj8dng-nig1h2f7eyqntlu_s.png\"\/><\/div>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>conditional_dfree()<\/code>:<\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"400\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/x6\/lv\/cj\/x6lvcjv-mny8eyz3cvqwsuhnlga.png\" data-src=\"https:\/\/habrastorage.org\/webt\/x6\/lv\/cj\/x6lvcjv-mny8eyz3cvqwsuhnlga.png\"\/><\/div>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/galoisinc.github.io\/MATE\/using-notebooks.html?highlight=jupyter%20notebook\">Jupyter Notebook<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0431\u043b\u043e\u043a\u043d\u043e\u0442, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u0440\u0435\u0434\u0443 MATE, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a CPG \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435. <\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/on\/3o\/0x\/on3o0xrhwncb-jialbshdzbfj0c.png\" data-src=\"https:\/\/habrastorage.org\/webt\/on\/3o\/0x\/on3o0xrhwncb-jialbshdzbfj0c.png\"\/><\/div>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f. \u0421 \u0443\u0447\u0435\u0442\u043e\u043c <a href=\"https:\/\/galoisinc.github.io\/MATE\/architecture.html#query-desc\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e API<\/a> \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u0435\u0439\u0441\u0430 \u0441 double-delete. \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u043c \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">delete_calls = session.query(cpg.Function).filter_by(name=\"_ZdaPv\").one() for call in delete_calls.callsites:   filtered_calls = delete_calls.callsites.copy()   filtered_calls.remove(call)   path = (       db.PathBuilder(cfl.ForwardCFGPath)       .starting_at(lambda Node: Node.uuid == call.uuid)       .stopping_at(lambda Node: Node.uuid.in_([c.uuid for c in filtered_calls]))       .limited_to(2000)       .build(cpg)   )    flow = (       session.query(path)       .join(cpg.Instruction, cpg.Instruction.uuid == path.target)       .with_entities(cpg.Instruction)   )   visualize_ctxt(cpg, flow, \"double-delete\")        <\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">                  funcs.cpp:89:5:double_delete()                   ==============================                   88:   delete [] x; double-delete --> 89:   delete [] x;                   90:   }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>PathBuilder<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u0432 CPG-\u0433\u0440\u0430\u0444\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>starting_at<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u043f\u0443\u0442\u044c. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>stopping_at<\/code> \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0443\u0437\u043b\u0430\u0445 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0443\u0442\u0438 \u0433\u0440\u0430\u0444\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>_ZdaPv<\/code> \u2014 \u043e\u043d\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 <code>operator delete[]<\/code>. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e MATE \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 LLVM IR, \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0435\u043c \u0432 FlowFinder \u0438 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>&lt;function>:llvm-link:@_ZdaPv<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0440\u044f\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 double-free \u0432 \u043d\u0430\u0448\u0435\u043c \u043c\u0438\u043d\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u043d\u0430 python, \u0441\u043b\u0435\u0434\u0443\u044f \u0441\u0445\u043e\u0436\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 Joern. \u0422\u043e \u0435\u0441\u0442\u044c, \u0441\u043f\u0435\u0440\u0432\u0430 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 <code>free<\/code> \u0431\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f. \u041e\u0446\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0443\u0437\u043b\u044b <code>STORE\/LOAD<\/code> \u0433\u0440\u0430\u0444\u0430. \u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>free<\/code> \u0438\u043b\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u043d\u0438\u043c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0442\u0430\u043a\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f MATE<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">class extCall:     def __init__(self, call, arg_idx):         self.call = call         self.arg_idx = arg_idx  def collectWrappers():         for call in frees.callsites:                 operations = call.argument0.operand0.used_by         operations.pop(0)         for op in operations:                if op.opcode.name == \"STORE\":                 break;         index = 0         for arg in call.parent_block.parent_function.arguments:             if call.argument0.operand0.variable == arg:                 for parent in call.parent_block.parent_function.callsites:                     funcName = call.parent_block.parent_function.name                     if funcName not in callNames:                         callNames.append(funcName)                     if extCall(parent, index) not in allCalls:                         allCalls.append(extCall(parent, index))                                      index+= 1  session.rollback() with session.no_autoflush:     allCalls = []     callNames = []     callNames.append(\"free\")     frees = session.query(cpg.Function).filter_by(name=\"free\").one()     for callsite in frees.callsites:         allCalls.append(extCall(callsite, 0))     collectWrappers()         for extObject in allCalls:         call = extObject.call         arg_idx = extObject.arg_idx         argumentObj = getattr(call, \"argument\" + str(arg_idx))         call_list = [c.call for c in allCalls]         call_list.remove(call)           filtered_list = [c for c in call_list                           if getattr(c, \"argument\" + str(arg_idx)).operand0.variable == argumentObj.operand0.variable]         if len(filtered_list) == 0:             continue;          for otherCall in filtered_list:             for operation in argumentObj.operand0.used_by:                 opUuid = int(operation.uuid)                              if opUuid > int(call.uuid) and opUuid &lt; int(otherCall.uuid):                     if operation.opcode.name == \"STORE\":                         filtered_list.remove(otherCall)                         break;                                        if operation.opcode.name == \"LOAD\" \\                     and operation.used_by[0].callee_operand.name not in callNames:                         call_uid = int(operation.used_by[0].uuid)                         load_uid = int(operation.uuid)                         arg_num = len(operation.used_by[0].callee_operand.arguments)                         idx = arg_num - (call_uid - load_uid)                         arg = operation.used_by[0].callee_operand.arguments[idx]                         internal_use = arg.used_by[0].operand1.used_by                         internal_use.pop(0)                         for op in internal_use:                             if op.opcode.name == \"STORE\":                                 filtered_list.remove(otherCall)                                 break; break; continue;          session.rollback()         path = (             db.PathBuilder(cfl.ForwardCFGPath)             .starting_at(lambda Node: Node.uuid == call.uuid)             .stopping_at(lambda Node: Node.uuid.in_([cs.uuid for cs in filtered_list]))             .limited_to(2000)             .build(cpg)         )          flow = (             session.query(path)             .join(cpg.Instruction, cpg.Instruction.uuid == path.target)             .with_entities(cpg.Instruction)         )          visualize_ctxt(cpg, flow, \"double-free here\")<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0410 \u0432\u043e\u0442 \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043d\u043e \u0432\u044b\u0434\u0430\u0441\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">                     funcs.cpp:14:2:double_free()                      ============================                      13:    free(buf1); double-free here --> 14:    free(buf1);                      15:    }                       funcs.cpp:41:2:df_by_pointer()                      ==============================                      40:    buf3 = (char *) malloc(SIZE); double-free here --> 41:    free(buf2);                      42:    free(buf3);                       funcs.cpp:69:2:conditional_dfree()                      ==================================                      68:    } double-free here --> 69:    free(ptr);                      70:    free(ptr);                       funcs.cpp:70:2:conditional_dfree()                      ==================================                      69:    free(ptr); double-free here --> 70:    free(ptr);                      71:    }                       funcs.cpp:70:2:conditional_dfree()                      ==================================                      69:    free(ptr); double-free here --> 70:    free(ptr);                      71:    }                       funcs.cpp:117:5:bad_goto()                      ==========================                      116:   free_me: double-free here --> 117:   free(ptr);                      118:   return;                       funcs.cpp:57:2:df_with_wrappers()                      =================================                      56:    wrapper(buf1); double-free here --> 57:    wrapper(buf1);                      58:    }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>MATE \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438, \u043d\u0435 \u0432\u044b\u0434\u0430\u0432 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043b\u043e\u0436\u043d\u043e\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0435\u0439\u0441\u0430. \u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442! \u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 CPG \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438\u0432\u043d\u043e. MATE \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"itogi\">\u0418\u0442\u043e\u0433\u0438<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u044f\u0434 open-source \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430, \u043e\u0446\u0435\u043d\u0438\u0432 \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0443\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c\u0438, \u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0432 \u043a\u043e\u0434\u0435. <\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0443 \u043e\u0431\u0437\u043e\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u0440\u044f\u0434 \u0441\u0432\u043e\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b, \u0430 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c\u0438\/\u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438. \u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u0437\u043e\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c, \u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a SAST \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u043a\u0435\u043f\u0441\u0438\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u0418 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a <strong>\u043e\u043f\u0440\u043e\u0441 \u043c\u043d\u0435\u043d\u0438\u0439!<\/strong> \u0423 \u043d\u0430\u0441 \u0432 Digital Security SAST \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e <a href=\"https:\/\/dsec.ru\/security-audit\/issledovanie-programmnogo-obespecheniya\/audit-ishodnogo-koda-po\/\">\u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0443\u0441\u043b\u0443\u0433\u0430\u0445 \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <\/p>\n<div class=\"tm-article-poll\">\n<div class=\"tm-notice tm-article-poll__notice tm-notice_positive\"><!----> <\/p>\n<div class=\"tm-notice__inner\"><!----> <\/p>\n<div class=\"tm-notice__content\"><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/company\/dsec\/blog\/702652\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__header\">\u0410 \u043a\u0430\u043a\u043e\u0439 SAST-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 C\/C++ \u043a\u043e\u0434\u0430?<\/div>\n<div class=\"tm-article-poll__answers\">\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">CodeQL<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             11.11%           <\/span> <span class=\"tm-article-poll__answer-label\">Semgrep<\/span> <span class=\"tm-article-poll__answer-votes\">             1           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:11.11%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Joern<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">MATE<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Weggli<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Clang Static Analyzer<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">SonarQube<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">             55.56%           <\/span> <span class=\"tm-article-poll__answer-label\">PVS-Studio<\/span> <span class=\"tm-article-poll__answer-votes\">             5           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width:55.56%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Infer<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Fortify<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">CodeSonar<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Veracode<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Coverity<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             22.22%           <\/span> <span class=\"tm-article-poll__answer-label\">Cppcheck<\/span> <span class=\"tm-article-poll__answer-votes\">             2           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:22.22%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">Flawfinder<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             11.11%           <\/span> <span class=\"tm-article-poll__answer-label\">\u0414\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442<\/span> <span class=\"tm-article-poll__answer-votes\">             1           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:11.11%;\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__stats\">        \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 9 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.          \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 3 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.      <\/div>\n<\/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\/dsec\/blog\/702652\/\"> https:\/\/habr.com\/ru\/company\/dsec\/blog\/702652\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sw\/wj\/9z\/swwj9zbqqwnfi1ge9a9j9axpkne.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sw\/wj\/9z\/swwj9zbqqwnfi1ge9a9j9axpkne.png\"\/><\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u044b\u043a\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u0432 \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f must-have \u0441\u043a\u0438\u043b\u043b\u043e\u043c. \u0418\u0441\u043a\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u0434\u0435, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432\u043f\u043e\u043b\u043d\u0435 \u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0438 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. \u041d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u043e\u0441\u043a\u043e\u0448\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442. <\/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-342011","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/342011","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=342011"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/342011\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=342011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=342011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=342011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}