{"id":329571,"date":"2024-05-23T01:47:58","date_gmt":"2024-05-23T01:47:58","guid":{"rendered":"https:\/\/www.baeldung.com\/java-static-code-analysis-infer"},"modified":"2024-05-23T01:47:58","modified_gmt":"2024-05-23T01:47:58","slug":"static-code-analysis-using-infer","status":"publish","type":"post","link":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/2024\/05\/23\/static-code-analysis-using-infer\/","title":{"rendered":"Static Code Analysis Using Infer"},"content":{"rendered":"<p class=\"syndicated-attribution\"><meta name= \\\"keywords \\\" content= \\\"\u96fb\u5b50\u8a08\u7b97\u6a5f, \u6559\u80b2, IT \u96fb\u8166\u73ed,\u96fb\u8166\u88dc\u7fd2\uff0c \u96fb\u8166\u73ed\uff0c \u5bb6\u6559\uff0c \u79c1\u4eba\u8001\u5e2b\uff0c \u8cc7\u8a0a\u6280\u8853\uff0c \u7a0b\u5e8f\u8a2d\u8a08\uff0c \u96fb\u5b50\u8a08\u7b97\u6a5f\uff0c \u904a\u6232\uff0c \u860b\u679c\uff0c \u96fb\u5f71\uff0c \u8a08\u7b97\u6a5f\uff0c\u7de8\u78bc\uff0c Java\uff0c C\/C++\uff0c JavaScript\uff0c PHP\uff0c HTML\uff0c CSS\uff0c MySQL\uff0c mobile\uff0c Android\uff0c \u52d5\u6f2b\uff0c Python\uff0c teacher\uff0c \u88dc\u7fd2\uff0c \u96fb\u8166\u88dc\u7fd2 \u8cc7\u8a0a, \u7535\u5b50\u8ba1\u7b97\u673a, IT ,Game, apple, movie, Computer,student,Java,\u6559\u80b2, ,\u5b66\u751f, \u5b66\u4e60, learn, \u6559\u5b66,  Android, apple,anime, animation, \u4fe1\u606f\u6280\u672f, \u7a0b\u5e8f\u8bbe\u8ba1, \u79fb\u52a8\u7535\u8bdd, \u8cc7\u8a0a\u79d1\u6280,Game, Jeu, Juego,Call Of Duty ,\u4f7f\u547d\u53ec\u559a , \u6e38\u620f, \u7535\u5b50\u6e38\u620f,, \u591a\u4eba\u7535\u5b50\u6e38\u620f, \u7f51\u7edc\u6e38\u620f\uff0conline\uff0conline game, \u624b\u673a\u6e38\u620f, mobile \\\"><\/p>\n<p><img src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured-1024x536.png\" class=\"webfeedsFeaturedVisual wp-post-image\" alt=\"Contact Us Featured\" style=\"float: left; margin-right: 5px;\" decoding=\"async\" srcset=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured-1024x536.png 1024w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured-300x157.png 300w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured-768x402.png 768w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured-100x52.png 100w, https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured.png 1200w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/p>\n<h2 id=\"bd-introduction\" data-id=\"introduction\">1. Introduction<\/h2>\n<div class=\"bd-anchor\" id=\"introduction\"><\/div>\n<p><span data-preserver-spaces=\"true\">In\u00a0<\/span><span data-preserver-spaces=\"true\">the realm of<\/span><span data-preserver-spaces=\"true\">\u00a0software development, ensuring code quality is very important, especially for complex and large codebases. <strong>Static code analysis tools like <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/\">Infer<\/a> provide us with techniques to detect potential bugs and vulnerabilities in our codebase before they manifest into critical issues.<\/strong><\/span><\/p>\n<p><span data-preserver-spaces=\"true\">In this tutorial, we&#8217;ll explore the fundamentals of code analysis, explore Infer&#8217;s capabilities, and provide practical insights into incorporating it into our development workflow.<\/span><\/p>\n<h2 id=\"bd-static-code-analysis\" data-id=\"static-code-analysis\">2. Static Code Analysis<\/h2>\n<div class=\"bd-anchor\" id=\"static-code-analysis\"><\/div>\n<p><strong>Static analysis is a debugging method that automatically examines source code without executing the program.<\/strong> This process facilitates the identification of potential defects, security vulnerabilities, and maintainability issues. Typically conducted by third-party tools like the well-known <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.sonarsource.com\/products\/sonarqube\/\">SonarQube<\/a>, static code analysis is straightforward when automated.<\/p>\n<p><span data-preserver-spaces=\"true\"><strong>Generally, it occurs in early development phases.<\/strong> Once the code\u00a0<\/span><span data-preserver-spaces=\"true\">is written<\/span><span data-preserver-spaces=\"true\">,\u00a0<\/span><span data-preserver-spaces=\"true\">a static code analyzer should be run<\/span><span data-preserver-spaces=\"true\">\u00a0to look over the code. It will check against defined coding rules from standards or custom predefined rules.\u00a0<\/span><span data-preserver-spaces=\"true\">Once the code\u00a0<\/span><span data-preserver-spaces=\"true\">is run<\/span><span data-preserver-spaces=\"true\">\u00a0through the static code analyzer, the analyzer will\u00a0<\/span><span data-preserver-spaces=\"true\">have identified whether or not<\/span><span data-preserver-spaces=\"true\">\u00a0the code complies with the set\u00a0<\/span><span data-preserver-spaces=\"true\">rules<\/span><span data-preserver-spaces=\"true\">.<\/span><\/p>\n<p>In a basic enterprise environment, it&#8217;s often part of the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/cs\/continuous-integration-deployment-delivery\">Continuous Integration (CI)<\/a> process. With each commit, a job is triggered to build the application, run tests, and analyze the code, ensuring compliance, safety, and security before deployment.<\/p>\n<h2 id=\"bd-infer\" data-id=\"infer\">3. Infer<\/h2>\n<div class=\"bd-anchor\" id=\"infer\"><\/div>\n<p><span data-preserver-spaces=\"true\"><strong>Infer is a static code analysis tool for Java, C, C++, and Objective-C, written in <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/ocaml.org\/\">OCaml<\/a>.<\/strong> It was first developed at Facebook and open-sourced in\u00a0<\/span><a class=\"editor-rtfLink\" href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/engineering.fb.com\/2015\/06\/11\/developer-tools\/open-sourcing-facebook-infer-identify-bugs-before-you-ship\/\"  rel=\"noopener\"><span data-preserver-spaces=\"true\">2015<\/span><\/a><span data-preserver-spaces=\"true\">. Since then, it has gained popularity beyond Facebook, being adopted by other large companies.<\/span><\/p>\n<p><span data-preserver-spaces=\"true\">For Java and Android code, it checks for issues like null pointer exceptions, resource leaks, and concurrency race conditions. In C, C++, and Objective-C, it detects problems such as null pointer issues, memory leaks, coding convention violations, and calls to unavailable APIs.<\/span><\/p>\n<p><strong>To efficiently handle large codebases,\u00a0Infer utilizes techniques like <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/separation-logic-and-bi-abduction\">separation logic and bi-abduction<\/a>.<\/strong><span data-preserver-spaces=\"true\">\u00a0Separation logic allows it to analyze small parts of the code storage independently, avoiding\u00a0<\/span><span data-preserver-spaces=\"true\">the need to process<\/span><span data-preserver-spaces=\"true\">\u00a0the entire memory space at once. Bi-abduction is a logical inference method that helps\u00a0<\/span><span data-preserver-spaces=\"true\">Infer discover<\/span><span data-preserver-spaces=\"true\">\u00a0properties about different parts of the code, allowing it to focus only on the modified sections during subsequent analyses.<\/span><\/p>\n<p><span data-preserver-spaces=\"true\">By combining<\/span><span data-preserver-spaces=\"true\">\u00a0these approaches<\/span><span data-preserver-spaces=\"true\">, this tool can<\/span><span data-preserver-spaces=\"true\">\u00a0find complex problems in modifications to an application built from millions of lines of\u00a0<\/span><span data-preserver-spaces=\"true\">code<\/span><span data-preserver-spaces=\"true\"> in a short time.<\/span><\/p>\n<h3 id=\"bd-1-infer-phases\" data-id=\"1-infer-phases\">3.1. Infer Phases<\/h3>\n<div class=\"bd-anchor\" id=\"1-infer-phases\"><\/div>\n<p>Infer operates in two main phases regardless of the input language: the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/infer-workflow#1-the-capture-phase\">capture phase<\/a> and the <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/infer-workflow#2-the-analysis-phase\">analysis phase<\/a>.<\/p>\n<p><strong>During the capture phase, Infer captures compilation commands to translate the files for analysis into its internal intermediate language.<\/strong> This translation is similar to compilation, so Infer takes information from the compilation process to perform its own translation. Also, this is the reason why we call Infer with a compilation command such as:<\/p>\n<pre><code class=\"language-bash\">infer run -- javac File.java<\/code><\/pre>\n<p>Therefore, the files get compiled as usual, and Infer also translates them to be analyzed in the second phase. Infer stores the intermediate files in the results directory, which is called <em>infer-out\/by<\/em> default and is created in the folder where the infer command is invoked.<\/p>\n<p>Also, we can invoke only the capture phase using the <em>capture<\/em> subcommand:<\/p>\n<pre><code class=\"language-bash\">infer capture -- javac File.java<\/code><\/pre>\n<p><strong>In the analysis phase, files in <em>infer-out\/<\/em> are analyzed individually by Infer. Each function and method is analyzed separately. If Infer encounters an error during the analysis of a method or function, it stops analysis for that specific entity but continues with others.<\/strong> Hence, a typical workflow involves running Infer on the code, addressing identified errors, and rerunning Infer to discover additional issues or confirm fixes.<\/p>\n<p>Detected errors are reported in the standard output and in a file named <em>infer-out\/report.txt<\/em>. Infer filters and highlight bugs that are most likely to be authentic.<\/p>\n<p>We can invoke only the analysis phase using the <em>analyze<\/em> subcommand:<\/p>\n<pre><code class=\"language-bash\">infer analyze<\/code><\/pre>\n<h3 id=\"bd-2-infer-global-and-differential-workflows\" data-id=\"2-infer-global-and-differential-workflows\">3.2. Infer Global and Differential Workflows<\/h3>\n<div class=\"bd-anchor\" id=\"2-infer-global-and-differential-workflows\"><\/div>\n<p>By default, Infer will delete the previous <em>infer-out\/<\/em> directory if existing. This leads to a <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/infer-workflow#global-workflow\">global workflow<\/a>, where the entire project is analyzed each time.<\/p>\n<p>Passing <em>&#8211;reactive<\/em> or <em>-r<\/em> to Infer prevents in from deleting <em>infer-out\/<\/em> directory, leading to a <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/infer-workflow#differential-workflow\">differential workflow<\/a>. For example, mobile apps use incremental build systems, where code evolves as a sequence of code changes. For these changes, it would make sense to analyze only the current changes in the project, instead of analyzing the whole project each time. Therefore, we can take advantage of Infer&#8217;s reactive mode and switch to a differential workflow.<\/p>\n<h3 id=\"bd-3-analyzing-projects\" data-id=\"3-analyzing-projects\">3.3. Analyzing Projects<\/h3>\n<div class=\"bd-anchor\" id=\"3-analyzing-projects\"><\/div>\n<p>To analyze files with Infer we can use compilers such as <em>javac<\/em> and <em>clang<\/em>. Also, we can use <em>gcc<\/em>, although Infer will use <em>clang<\/em> internally. Moreover, we can use Infer with various build systems.<\/p>\n<p>One popular build system for Java is <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/maven\">Maven<\/a>, and we can use together with Infer in the following way:<\/p>\n<pre><code class=\"language-bash\">infer run -- mvn &lt;maven target&gt;<\/code><\/pre>\n<p>Also, we can use Infer together with <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/gradle\">Gradle<\/a>:<\/p>\n<pre><code class=\"language-bash\">infer run -- gradle &lt;gradle task&gt;<\/code><\/pre>\n<h3 id=\"bd-4-recommended-flow-for-ci\" data-id=\"4-recommended-flow-for-ci\">3.4. Recommended Flow for CI<\/h3>\n<div class=\"bd-anchor\" id=\"4-recommended-flow-for-ci\"><\/div>\n<p><strong>Infer recommends using the differential workflow for Continuous Integration (CI).<\/strong> Therefore, the flow would be to determine the modified files and run the analysis in reactive mode. Also, if we would like to run more than one analyzer, it is more efficient to separate the capture phase, so that the result can be used by all the analyzers.<\/p>\n<h2 id=\"bd-running-infer\" data-id=\"running-infer\">4. Running Infer<\/h2>\n<div class=\"bd-anchor\" id=\"running-infer\"><\/div>\n<p>We have multiple options to use Infer: binary releases, build Infer from source, or <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/www.baeldung.com\/ops\/docker-guide\">Docker<\/a> images. <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/getting-started\">Getting started with the Infer<\/a> page explains how we can get and run Infer.<\/p>\n<p>Now, we can create some dummy Java code snippets and analyze them. Not that we will cover only a few issues Infer can identify, and <strong>a complete list of all types of issues that can be detected by Infer can be found <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/fbinfer.com\/docs\/all-issue-types\">here<\/a>.<\/strong><\/p>\n<h3 id=\"bd-1-null-dereference\" data-id=\"1-null-dereference\">4.1. Null Dereference<\/h3>\n<div class=\"bd-anchor\" id=\"1-null-dereference\"><\/div>\n<pre><code class=\"language-java\">public class NullPointerDereference {\r\n    public static void main(String[] args) {\r\n        NullPointerDereference.nullPointerDereference();\r\n    }\r\n    private static void nullPointerDereference() {\r\n        String str = null;\r\n        int length = str.length();\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>If we Infer against this code, we&#8217;ll have the following output:<\/p>\n<pre><code class=\"language-bash\">Analyzed 1 file\r\nFound 1 issue\r\n.\/NullPointerDereference.java:11: error: NULL_DEREFERENCE\r\n  object str last assigned on line 10 could be null and is dereferenced at line 11\r\n   9.       private static void nullPointerDereference() {\r\n  10.           String str = null;\r\n  11. &gt;         int length = str.length();\r\n  12.       }\r\n  13.   }\r\n  24.   \r\nSummary of the reports\r\n  NULL_DEREFERENCE: 1<\/code><\/pre>\n<h3 id=\"bd-2-resource-leak\" data-id=\"2-resource-leak\">4.2. Resource Leak<\/h3>\n<div class=\"bd-anchor\" id=\"2-resource-leak\"><\/div>\n<pre><code class=\"language-java\">public class ResourceLeak {\r\n    public static void main(String[] args) throws IOException {\r\n        ResourceLeak.resourceLeak();\r\n    }\r\n    private static void resourceLeak() throws IOException {\r\n        FileOutputStream stream;\r\n        try {\r\n            File file = new File(&quot;randomName.txt&quot;);\r\n            stream = new FileOutputStream(file);\r\n        } catch (IOException e) {\r\n            return;\r\n        }\r\n        stream.write(0);\r\n    }\r\n}<\/code><\/pre>\n<p>Now, by running Infer, we can see that a resource leak was detected:<\/p>\n<pre><code class=\"language-bash\">Analyzed 1 file\r\nFound 1 issue\r\n.\/ResourceLeak.java:21: error: RESOURCE_LEAK\r\n   resource of type java.io.FileOutputStream acquired to stream by call to FileOutputStream(...) at line 17 is not released after line 21\r\n  19.               return;\r\n  20.           }\r\n  21. &gt;         stream.write(0);\r\n  22.       }\r\n  23.   }\r\n  24.   \r\nSummary of the reports\r\n  RESOURCE_LEAK: 1<\/code><\/pre>\n<h3 id=\"bd-3-division-by-zero\" data-id=\"3-division-by-zero\">4.3. Division by Zero<\/h3>\n<div class=\"bd-anchor\" id=\"3-division-by-zero\"><\/div>\n<pre><code class=\"language-java\">public class DivideByZero {\r\n    public static void main(String[] args) {\r\n        DivideByZero.divideByZero();\r\n    }\r\n    private static void divideByZero() {\r\n        int dividend = 5;\r\n        int divisor = 0;\r\n        int result = dividend \/ divisor;\r\n    }\r\n}<\/code><\/pre>\n<p>The following output is displayed for our code:<\/p>\n<pre><code class=\"language-bash\">Analyzed 1 file\r\nFound 1 issue\r\n.\/DivideByZero.java:9: error: DIVIDE_BY_ZERO\r\n  The denominator for division is zero, which triggers an Arithmetic exception.\r\n  6. private static void divideByZero() {\r\n  7.     int dividend = 5;\r\n  8.     int divisor = 0;\r\n  9. &gt;    int result = dividend \/ divisor;\r\n  10. }\r\nSummary of the reports\r\nDIVIDE_BY_ZERO: 1<\/code><\/pre>\n<h2 id=\"bd-conclusion\" data-id=\"conclusion\">5. Conclusion<\/h2>\n<div class=\"bd-anchor\" id=\"conclusion\"><\/div>\n<div class=\"flex flex-grow flex-col max-w-full\">\n<div class=\"min-h-[20px] text-message flex flex-col items-start whitespace-pre-wrap break-words [.text-message+&amp;]:mt-5 overflow-x-auto gap-3\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"b52e4549-b985-49a7-b6d4-7f97810a6192\">\n<div class=\"markdown prose w-full break-words dark:prose-invert dark\">\n<p><span data-preserver-spaces=\"true\">As we&#8217;ve discovered throughout this tutorial, static code analysis tools are crucial for the software development\u00a0<\/span><span data-preserver-spaces=\"true\">process<\/span><span data-preserver-spaces=\"true\">. One such tool is Infer, which stands out for its ability to detect\u00a0<\/span><span data-preserver-spaces=\"true\">a wide range of<\/span><span data-preserver-spaces=\"true\">\u00a0issues in various programming languages.\u00a0<\/span><strong><span data-preserver-spaces=\"true\">By leveraging static code analysis with Infer, we can proactively address bugs and vulnerabilities, leading to more reliable and secure software applications.<\/span><\/strong><\/p>\n<p>As always, the source code is available <a href=\"https:\/\/feeds.feedblitz.com\/~\/t\/0\/0\/baeldung\/~https:\/\/github.com\/eugenp\/tutorials\/tree\/master\/static-analysis\">over on GitHub<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><Img align=\"left\" border=\"0\" height=\"1\" width=\"1\" alt=\"\" style=\"border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;\" hspace=\"0\" src=\"https:\/\/feeds.feedblitz.com\/~\/i\/897342413\/0\/baeldung\"><\/p>\n<div style=\"clear:both;padding-top:0.2em;\"><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/897342413\/baeldung,https%3A%2F%2Fwww.baeldung.com%2Fwp-content%2Fuploads%2F2021%2F09%2FJava-8-Featured-1024x536.png\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Post to X.com\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/x.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\" style=\"border:0;margin:0;padding:0;\"><\/a>&#160;<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/java-static-code-analysis-infer#respond\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>&#160;<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/java-static-code-analysis-infer\/feed\"><img decoding=\"async\" height=\"20\" style=\"border:0;margin:0;padding:0;\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>&#160;<\/div>\n\n<p class=\"syndicated-attribution\"><figure class= \\\"wp-block-image alignnone \\\"><img src= \\\"http:\/\/itteacheritfreelance.hk\/test\/wordpress\/wp-content\/uploads\/2016\/05\/logo2-2.png\\\" alt=\\\"IT\u96fb\u8166\u88dc\u7fd2 java\u88dc\u7fd2 \u70ba\u5927\u5bb6\u914d\u5c0d\u96fb\u8166\u88dc\u7fd2,IT freelance, \u79c1\u4eba\u8001\u5e2b, PHP\u88dc\u7fd2,CSS\u88dc\u7fd2,XML,Java\u88dc\u7fd2,MySQL\u88dc\u7fd2,graphic design\u88dc\u7fd2,\u4e2d\u5c0f\u5b78ICT\u88dc\u7fd2,\u4e00\u5c0d\u4e00\u79c1\u4eba\u88dc\u7fd2\u548cFreelance\u81ea\u7531\u5de5\u4f5c\u914d\u5c0d\u3002\\\"\/><figcaption>\u7acb\u523b\u8a3b\u518a\u53ca\u5831\u540d\u96fb\u8166\u88dc\u7fd2\u8ab2\u7a0b\u5427!<\/figcaption><\/figure>\r\n<\/br>Find A Teacher Form:\r\n<\/br>https:\/\/docs.google.com\/forms\/d\/1vREBnX5n262umf4wU5U2pyTwvk9O-JrAgblA-wH9GFQ\/viewform?edit_requested=true#responses\r\n<\/br><\/br>Email:\r\n<\/br>public1989two@gmail.com<br><br><br><br><br><br><br>\r\n<a href=www.itsec.hk style=color:#FFFFFF;>www.itsec.hk<\/a><br>\r\n<a href=\\\"www.itsec.vip\\\" style=color:#FFFFFF;>www.itsec.vip<\/a><br>\r\n<a href=\\\"www.itseceu.uk\\\" style=color:#FFFFFF;>www.itseceu.uk<\/a><br><\/p>","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p><img decoding=\"async\" src=\"https:\/\/www.baeldung.com\/wp-content\/uploads\/2021\/09\/Java-8-Featured-1024x536.png\" class=\"webfeedsFeaturedVisual wp-post-image\" alt=\"Contact Us Featured\"><\/p>\n<p>Explore the fundamentals of code analysis, learn about Infer&#8217;s capabilities, and get practical insights into incorporating it into your development workflow.<\/p>\n<div><a title=\"Like on Facebook\" href=\"https:\/\/feeds.feedblitz.com\/_\/28\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/fblike20.png\"><\/a>\u00a0<a title=\"Pin it!\" href=\"https:\/\/feeds.feedblitz.com\/_\/29\/897342413\/baeldung,https%3A%2F%2Fwww.baeldung.com%2Fwp-content%2Fuploads%2F2021%2F09%2FJava-8-Featured-1024x536.png\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/pinterest20.png\"><\/a>\u00a0<a title=\"Post to X.com\" href=\"https:\/\/feeds.feedblitz.com\/_\/24\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/x.png\"><\/a>\u00a0<a title=\"Subscribe by email\" href=\"https:\/\/feeds.feedblitz.com\/_\/19\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/email20.png\"><\/a>\u00a0<a title=\"Subscribe by RSS\" href=\"https:\/\/feeds.feedblitz.com\/_\/20\/897342413\/baeldung\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/rss20.png\"><\/a>\u00a0<a rel=\"NOFOLLOW\" title=\"View Comments\" href=\"https:\/\/www.baeldung.com\/java-static-code-analysis-infer#respond\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/comments20.png\"><\/a>\u00a0<a title=\"Follow Comments via RSS\" href=\"https:\/\/www.baeldung.com\/java-static-code-analysis-infer\/feed\"><img decoding=\"async\" height=\"20\" src=\"https:\/\/assets.feedblitz.com\/i\/commentsrss20.png\"><\/a>\u00a0<\/div>\n<\/div>","protected":false},"author":2059,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"slim_seo":{"title":"Static Code Analysis Using Infer - ITTeacherITFreelance.hk","description":"Explore the fundamentals of code analysis, learn about Infer's capabilities, and get practical insights into incorporating it into your development workflow. \u00a0"},"footnotes":""},"categories":[6,1307],"tags":[],"_links":{"self":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/329571"}],"collection":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/2059"}],"replies":[{"embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=329571"}],"version-history":[{"count":1,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/329571\/revisions"}],"predecessor-version":[{"id":329572,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/329571\/revisions\/329572"}],"wp:attachment":[{"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=329571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=329571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itteacheritfreelance.hk\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=329571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}