<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Valerie Kuzmina</title>
    <description>The latest articles on Forem by Valerie Kuzmina (@valeriekukuss).</description>
    <link>https://forem.com/valeriekukuss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F986720%2F81dc07aa-be66-48d2-9a57-4be1c77e5f3f.jpg</url>
      <title>Forem: Valerie Kuzmina</title>
      <link>https://forem.com/valeriekukuss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/valeriekukuss"/>
    <language>en</language>
    <item>
      <title>Qodana Is Out Of Preview With First-Class JetBrains IDE Integration</title>
      <dc:creator>Valerie Kuzmina</dc:creator>
      <pubDate>Fri, 21 Jul 2023 08:33:58 +0000</pubDate>
      <link>https://forem.com/qodana/qodana-is-out-of-preview-with-first-class-jetbrains-ide-integration-1fn3</link>
      <guid>https://forem.com/qodana/qodana-is-out-of-preview-with-first-class-jetbrains-ide-integration-1fn3</guid>
      <description>&lt;p&gt;JetBrains has always strived to deliver tools that make developers’ work enjoyable, creative, and thought-provoking. JetBrains IDEs are designed to understand code and provide valuable suggestions for improving it. Having these tips available in the editor is incredibly helpful. But modern CI-centric workflows require a reliable quality gate in your build pipeline. With that in mind, we created Qodana. &lt;/p&gt;

&lt;p&gt;Qodana is the only code quality platform on the market that uses inspections native to JetBrains IDEs and expands the smartness of your JetBrains IDE to the CI server. &lt;/p&gt;

&lt;p&gt;We built this powerful static analysis engine to enable development teams to automate code reviews, build quality gates, and enforce code quality guidelines enterprise-wide – all within their JetBrains ecosystem. The platform can be integrated into any CI/CD pipeline and can analyze code written in 60+ languages, including Java, JavaScript, TypeScript, PHP, Kotlin, Python, Go, and C#.&lt;/p&gt;

&lt;p&gt;Today, Qodana announces a huge milestone: It’s no longer in preview and is available commercially with some major improvements. Get in now to enjoy a 50% discount on your first year.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/qodana/" rel="noopener noreferrer"&gt;Try Qodana for free&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new in Qodana 2023.2
&lt;/h2&gt;

&lt;p&gt;Many of you have been wondering where the name “Qodana” came from. Let us explain.&lt;/p&gt;

&lt;p&gt;“Qodana” stands for “code analyzer”.&lt;/p&gt;

&lt;p&gt;Back in 2021, after weeks of fruitless brainstorming on the product’s name, we turned to one of our polyglot colleagues for guidance. Ten minutes later, she suggested “Qodana” and right away we knew that was it.&lt;/p&gt;

&lt;p&gt;Since launching Qodana in EAP in 2021, we’ve been overjoyed by the response. To date, Qodana analyzes commits to over 9K unique projects on a monthly basis – 80% of these projects are commercial.&lt;/p&gt;

&lt;p&gt;Our early adopters have taught us a lot about what they need, and we’ve used that knowledge to make some major improvements to the static code analysis engine of Qodana. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Server-side analysis by Qodana is now fully integrated with JetBrains IDEs 2023.2
&lt;/h2&gt;

&lt;p&gt;Static analysis tools are known to be complicated to configure. With the Qodana 2023.2 release, we’ve eliminated this pain by fully integrating our code quality platform with almost all JetBrains IDEs: IntelliJ IDEA, WebStorm, PhpStorm, PyCharm, Rider, and GoLand. Please note that this functionality won’t be available until the release of the 2023.2 versions of our IDEs. &lt;/p&gt;

&lt;p&gt;This integration will bring two important benefits. &lt;/p&gt;

&lt;p&gt;The first benefit is the ease of configuration. You can try the local analysis with just a few clicks, view the list of problems across your entire project, and then configure Qodana in your preferred CI/CD system to establish the quality gate and run server-side checks. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ads7alix9jen3u8qwcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ads7alix9jen3u8qwcx.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second benefit is an improved code quality workflow. Once Qodana is configured in the continuous integration server, you’ll be able to see the results of the server-side analysis without leaving the IDE – right out of the box. Alternatively, you can navigate directly to Qodana Cloud to see the issue overview in a straightforward sunburst diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Code coverage support
&lt;/h2&gt;

&lt;p&gt;Qodana now supports processing code coverage for Java, Kotlin, PHP, JavaScript and TypeScript. While running automated tests, Qodana will display how much of the code has been executed by relying on the output from the known unit testing frameworks. This way, users will be able to 1) review the degree of code coverage, 2) spot parts of the code that need more testing, 3) assess the quality of the tests themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9wtvzzaqetsxmx9hw5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz9wtvzzaqetsxmx9hw5l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Vulnerability checker based on the Checkmarx data
&lt;/h2&gt;

&lt;p&gt;Now Qodana is bundled with the vulnerability checker, powered by IntelliJ IDEA. This inspection is designed to spot vulnerable external packages used in the project. The data about vulnerabilities is provided by the software security company Checkmarx.&lt;/p&gt;

&lt;p&gt;The vulnerability checker goes beyond just providing security information. It also offers valuable remediation insights. Developers can take immediate action to address vulnerabilities by quickly migrating to a safe and stable version of the package without known vulnerability issues. &lt;/p&gt;

&lt;h2&gt;
  
  
  4. Quick-fixes (experimental)
&lt;/h2&gt;

&lt;p&gt;All Qodana linters (except for .NET) will provide users with the power of quick-fixes to boost their coding efficiency. Qodana is now able to apply quick-fixes to issues that can be resolved automatically and create a new pull request with the applied changes (currently available only for GitHub Actions). Then, the user will be able to review these changes before committing. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu0ljngzyhk8i7yf0oyr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu0ljngzyhk8i7yf0oyr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the complete list of changes, refer to &lt;a href="https://www.jetbrains.com/help/qodana/new-in-2023-2.html" rel="noopener noreferrer"&gt;What’s new in Qodana 2023.2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qodana features beyond the 2023.2 release
&lt;/h2&gt;

&lt;p&gt;In case you haven’t tried Qodana yet, here’s a brief overview of features that are currently available in the product – beyond the newly released ones. &lt;/p&gt;

&lt;h2&gt;
  
  
  2500+ code inspections – exclusive Qodana inspections included
&lt;/h2&gt;

&lt;p&gt;Qodana can spot performance issues, unused declarations, vulnerable dependencies, potential security issues, confusing code constructs, naming and style conventions, and much more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive inspection reports and dashboards
&lt;/h2&gt;

&lt;p&gt;Discover issues and trends in your code and better understand the quality of your project with our fancy sunburst diagram. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57019ik6rs49m3f5ooxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57019ik6rs49m3f5ooxr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud-based overview of reports
&lt;/h2&gt;

&lt;p&gt;You can accumulate all of your Qodana reports in a single place – Qodana Cloud – and explore project trends with interactive dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  The baseline for getting your technical debt under control
&lt;/h2&gt;

&lt;p&gt;A snapshot of the codebase, or baseline, is taken during specific Qodana runs. You can compare your current code with its baseline state and see new, unchanged, and resolved problems. &lt;/p&gt;

&lt;p&gt;For example, you can use the baseline to put less critical issues on the back burner and focus on fixing bugs that are either new or highly critical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7486gsczsgem0ur7ez9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7486gsczsgem0ur7ez9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Third-party license audit
&lt;/h2&gt;

&lt;p&gt;Scan dependencies in your code repository to find their licenses and see if they’re compatible with your project license.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspection constructor
&lt;/h2&gt;

&lt;p&gt;Looking to scan for a specific problem that Qodana doesn’t cover yet? You can integrate it with third-party inspection tools or create your own plugins.&lt;/p&gt;

&lt;p&gt;A video is worth a thousand words, so please feel free to check out the &lt;a href="https://youtu.be/WrhnUnzMUCg" rel="noopener noreferrer"&gt;Qodana overview video&lt;/a&gt; by our Developer Advocate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qodana pricing that makes managers say “Wow”
&lt;/h2&gt;

&lt;p&gt;What decision-makers especially like about Qodana is that we charge per active contributor, regardless of the number of lines in the project. This makes Qodana an especially cost-efficient offer. &lt;/p&gt;

&lt;p&gt;Qodana is available in three plans, including a free plan with limited language support, and paid plans starting from $6 per active contributor per month. Paid plans require minimum of 3 active contributors. &lt;/p&gt;

&lt;p&gt;The most advanced Qodana plan, which offers more security inspections and the license audit, comes with a one-year 50% discount! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmzeb1677vqdubruqqjt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmzeb1677vqdubruqqjt.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get started with Qodana?
&lt;/h2&gt;

&lt;p&gt;Simply head to our &lt;a href="https://www.jetbrains.com/qodana/" rel="noopener noreferrer"&gt;website&lt;/a&gt; and claim your free trial! You’ll be asked to create an account in Qodana Cloud and connect the specified linter to your project and preferred CI/CD system. It’s that easy!&lt;/p&gt;

&lt;p&gt;Our mission is to help developers deliver code they can be proud of. We hope you enjoy Qodana and all the intelligence it packs into a straightforward sunburst diagram. If you have any questions, feel free to submit a ticket to the &lt;a href="https://youtrack.jetbrains.com/issues?q=%23QD&amp;amp;_ga=2.133486798.1910624791.1689585216-3373284.1664957792&amp;amp;_gac=1.79264486.1689239733.CjwKCAjwwb6lBhBJEiwAbuVUSkFX63d9ZOiUdVTPW3HLgsotpIsY-whA2LG7bFNB3rZWxVM7_YFlDBoCM-kQAvD_BwE&amp;amp;_gl=1*rt5956*_ga*MzM3MzI4NC4xNjY0OTU3Nzky*_ga_9J976DJZ68*MTY4OTkyNzQzOS4xNzQuMS4xNjg5OTI3Nzk0LjIzLjAuMA.." rel="noopener noreferrer"&gt;issue tracker&lt;/a&gt; or leave a comment below.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>coding</category>
      <category>codequality</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Secure Your PHP Code With Taint Analysis by Qodana</title>
      <dc:creator>Valerie Kuzmina</dc:creator>
      <pubDate>Fri, 10 Mar 2023 14:16:23 +0000</pubDate>
      <link>https://forem.com/qodana/secure-your-php-code-with-taint-analysis-by-qodana-1mj8</link>
      <guid>https://forem.com/qodana/secure-your-php-code-with-taint-analysis-by-qodana-1mj8</guid>
      <description>&lt;p&gt;It only takes one user to exploit a vulnerability in your project and breach your system. To defend programs against malicious inputs from external users (known as “taints”), development teams add taint checking to their static analysis routines. &lt;/p&gt;

&lt;p&gt;In this year’s first release, the &lt;a href="https://www.jetbrains.com/qodana/"&gt;Qodana&lt;/a&gt; team has delivered taint analysis for PHP in the EAP. The feature is available only in Qodana for PHP 2023.1 (jetbrains/qodana-php:2023.1-eap). Qodana for PHP was the first linter we released, so we decided to let PHP developers be the first to test our new security functionality, too. We plan on adding more languages in the future, after we’ve collected enough feedback.&lt;/p&gt;

&lt;p&gt;Read on to learn more about what taint analysis is and how it works in Qodana. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9I62NLIH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/clwaxqlnq3rcml4ydr0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9I62NLIH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/clwaxqlnq3rcml4ydr0r.png" alt="Image description" width="880" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/qodana"&gt;GET STARTED WITH QODANA&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is taint analysis?
&lt;/h2&gt;

&lt;p&gt;A taint is any value that can pose a security risk when modified by an external user. If you have a taint in your code and unverified external data can be distributed across your program, hackers can execute these code fragments to cause SQL injection, arithmetic overflow, cross-site scripting, path traversal, and more. Usually they exploit these vulnerabilities to destroy the system, hijack credentials and other data, and change the system’s behavior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zFYxtItn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gg88k8j31t85sz7igi3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zFYxtItn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gg88k8j31t85sz7igi3w.png" alt="Image description" width="880" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example of a taint. Arbitrary data from the GET parameter is displayed on the screen. For example, malicious users can exploit this vulnerability to tamper with your program’s layout.  &lt;/p&gt;

&lt;p&gt;As an extra layer of defense against malicious inputs, development teams execute taint analysis when they run a security audit on the program’s attack surface. &lt;/p&gt;

&lt;p&gt;Taint analysis is the process of assessing the flow of untrusted user input throughout the body of a function or method. Its core goal is to determine if unanticipated input can affect program execution in malicious ways. &lt;/p&gt;

&lt;p&gt;Taint sources are locations where a program gets access to potentially tainted data. Key points in a program that are susceptible to allowing tainted input are called taint sinks. This data can be propagated to the sinks via function calls or assignments.&lt;/p&gt;

&lt;p&gt;If you run taint analysis manually, you should spot all of the places where you accept data from external users and follow each piece of data through the system – the tainted data can be used in dozens of nodes. Then, to prevent taint propagation, you should take one of the two approaches described below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanitize the data&lt;/strong&gt;, i.e. transform data to a safe state. In the example below, we removed tags to resolve the taint. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xw_xWDHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r9qmighs2wsuae25wwtm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xw_xWDHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r9qmighs2wsuae25wwtm.png" alt="Image description" width="880" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate the data&lt;/strong&gt;, i.e. check that the added data conforms to a required pattern. In the example below, we enable validation for the &lt;code&gt;$email&lt;/code&gt; variable. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ilQhMOz3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gdmzu7kqtfctnhqbad3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ilQhMOz3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gdmzu7kqtfctnhqbad3.png" alt="Image description" width="880" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In other words, the taint analysis inspection traces user-tainted data from its source to your sinks, and raises the alarm when you work with that data without sanitizing or validating it. &lt;/p&gt;

&lt;h2&gt;
  
  
  How taint analysis works in Qodana
&lt;/h2&gt;

&lt;p&gt;Taint analysis is performed by Qodana for PHP starting from version 2023.1 EAP. This functionality includes an inspection that scans the code and highlights the taint and potential vulnerability, the ability to open the problem in PhpStorm to address it on the spot, and a dataflow graph visualizing the taint flow. &lt;/p&gt;

&lt;h2&gt;
  
  
  Example #1. SQL injection
&lt;/h2&gt;

&lt;p&gt;Let’s take a look at an example of SQL injection and how Qodana detects it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gEYov37G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rbcggyhe1jyvgeulkgpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gEYov37G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rbcggyhe1jyvgeulkgpd.png" alt="Image description" width="880" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, Qodana shows us the following taints in the system_admin() function:&lt;/p&gt;

&lt;p&gt;Markers 1-2: Data from user form input is retrieved from the $_POST global array with no sanitization or validation and is assigned to the variable $edit. This is a taint.&lt;/p&gt;

&lt;p&gt;Marker 3: The tainted variable $edit is passed to the system_save_settings function as an argument without any proper sanitization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9DwtBJKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/17dnyolv25xtwdbsv80t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9DwtBJKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/17dnyolv25xtwdbsv80t.png" alt="Image description" width="880" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marker 4: Data from the $edit variable is now located in the $edit parameter.&lt;/p&gt;

&lt;p&gt;Marker 5: The $edit variable is passed to foreach with the $filename key and $status value. Both variables contain the tainted data from the $edit variable concatenated with the string. The $filename key is concatenated with a tainted SQL string, and then it will propagate tainted data into an argument passed to the db_query.&lt;/p&gt;

&lt;p&gt;Marker 6: The $ filename key contains the tainted data from the $edit variable concatenated with the string.&lt;/p&gt;

&lt;p&gt;Marker 7: The $ filename key is concatenated with a tainted SQL string.&lt;/p&gt;

&lt;p&gt;Marker 8: Tainted SQL string will propagate tainted data into an argument passed to the &lt;code&gt;db_query&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let’s now look at the db_query:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oQEh80nb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4qlrofkpext33wvlwr2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oQEh80nb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4qlrofkpext33wvlwr2n.png" alt="Image description" width="880" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marker 9: The tainted string will be located in the $query parameter.&lt;/p&gt;

&lt;p&gt;Marker 10: This parameter is going to be an argument of the _db_query function.&lt;/p&gt;

&lt;p&gt;Let’s move on to the _db_query function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AkcIjbY0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f84czipidydows32uiko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AkcIjbY0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f84czipidydows32uiko.png" alt="Image description" width="880" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marker 11: Tainted data located in the first parameter $ query of the _db_query function.&lt;/p&gt;

&lt;p&gt;Marker 12: Data of the parameter is passed to the mysql_query function, which is a sink.&lt;/p&gt;

&lt;p&gt;The whole data flow above illustrates how data moves from $_POST[“edit”] to the mysql_query($query) without any sanitization or validation. This allows the attacker to manipulate the SQL query which was concatenated with a key of $_POST[“edit”] and trigger SQL injection. &lt;/p&gt;

&lt;p&gt;Qodana will spot these risks in your codebase along with all nodes where tainted data is used, so you can sanitize all tainted data in a timely manner. &lt;/p&gt;

&lt;h2&gt;
  
  
  Example #2. XSS problem
&lt;/h2&gt;

&lt;p&gt;In the Qodana UI, you can see a graph that visualizes the entire taint flow. Here’s how Qodana will visualize the XSS vulnerability, which contains 2 sources that would be merged on marker 5.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uMRBB9XS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2f95eh48iol52hymx1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uMRBB9XS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2f95eh48iol52hymx1v.png" alt="Image description" width="880" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W5d1k1AB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1t5bg2a5zci2yefzixwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W5d1k1AB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1t5bg2a5zci2yefzixwr.png" alt="Image description" width="880" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Markers 1-2: Data from the searchUpdate.pos file will be read and tainted data will be assigned to the $start variable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Markers 3-4: Data from files whose path is located in $posFile will be read and tainted data will be assigned to the $start variable.&lt;/p&gt;

&lt;p&gt;Marker 5: A merged tainted state from all conditional branches in the $start variable will be passed as an argument to the doUpdateSearchIndex method.&lt;/p&gt;

&lt;p&gt;Let’s look inside the doUpdateSearchIndex() method:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NJrLqazA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/592t4vvyrz3gijzk4xu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NJrLqazA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/592t4vvyrz3gijzk4xu9.png" alt="Image description" width="880" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Markers 6-8: The $ start parameter will contain tainted data on this dataflow slice and then it will be passed within a concatenated string as an argument to the &lt;code&gt;output&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;Let’s look inside the output method:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3EwxMS0O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ojno451lsmsjaw66f51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3EwxMS0O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ojno451lsmsjaw66f51.png" alt="Image description" width="880" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marker 9: Tainted data contained inside the transmitted string will be located in the $out parameter.&lt;/p&gt;

&lt;p&gt;Marker 10: Data from the $out parameter will be transferred to the &lt;code&gt;print&lt;/code&gt; function without any sanitization. This function is a sink and causes XSS vulnerability, which can be exploited.&lt;/p&gt;

&lt;p&gt;To exploit the vulnerability, an attacker can, for example, upload a shell script instead of the expected files in markers 1 and 2, and will be able to put any information onto the web page as a result of an unsanitized print function.&lt;/p&gt;

&lt;p&gt;Qodana will alert you to this vulnerability and give it a high priority so that you can resolve it as soon as possible and prevent the hack.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Taint analysis helps eliminate exploitable attack surfaces, so it’s an effective method to reduce risk to your software. To learn about taint analysis and Qodana in detail, explore Qodana documentation.&lt;/p&gt;

&lt;p&gt;Happy developing and keep your code healthy!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/qodana"&gt;GET STARTED WITH QODANA&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>php</category>
      <category>security</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Qodana and IntelliJ IDEA: How a Code Quality Platform Streamlined the Localization of an IDE</title>
      <dc:creator>Valerie Kuzmina</dc:creator>
      <pubDate>Mon, 23 Jan 2023 10:33:23 +0000</pubDate>
      <link>https://forem.com/qodana/qodana-and-intellij-idea-how-a-code-quality-platform-streamlined-the-localization-of-an-ide-2l2e</link>
      <guid>https://forem.com/qodana/qodana-and-intellij-idea-how-a-code-quality-platform-streamlined-the-localization-of-an-ide-2l2e</guid>
      <description>&lt;p&gt;Have you ever wondered how to make sure that your determination to live a healthier life, not sweat the small stuff, and work smarter, not harder continues past Valentine’s Day? Psychologists say that breaking big goals into small steps is the best way to stick to your New Year’s resolutions.&lt;/p&gt;

&lt;p&gt;This advice applies to programmers’ resolutions too. If you plan a large project that involves code refactoring, you may want to see the full picture of the required changes and plan accordingly. This is exactly what the IntelliJ team did when they needed to localize the IDE’s entire UI into Chinese, Japanese, and Korean.&lt;/p&gt;

&lt;p&gt;Using Qodana, the code quality platform from JetBrains, as a single source of truth for their localization process, the IntelliJ team managed to finish the project much faster than expected. This positive outcome was a result of wise planning, accountability, and oversight. Here’s how they did it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2iwn8m25y4wwa1tar7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2iwn8m25y4wwa1tar7t.png" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/qodana" rel="noopener noreferrer"&gt;TRY QODANA FOR FREE&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The challenge: isolate 13,000 hard-coded strings and monitor progress effectively
&lt;/h3&gt;

&lt;p&gt;To streamline the localization of their UI into 3 different languages, the IntelliJ team needed to strip out all localizable items from the source code and put them into separate properties files to be handed over for translation.&lt;/p&gt;

&lt;p&gt;With over 13,000 strings, it was easy for some localizable ones to be overlooked, meaning that they remained in the code. When localizing the UI, hard-coded strings can be the most difficult parts to deal with. They are hard to find because they do not show up until the software has been localized. As a result, if a user installed the Japanese language pack, for example, some parts of the UI would still be in English.&lt;/p&gt;

&lt;p&gt;The team was therefore left with much tedious and repetitive work. As a result the head of the localization project was looking for a solution that would allow them to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automate a huge chunk of the work by continuously inspecting the code base for hard-coded string literals.&lt;/li&gt;
&lt;li&gt;Assign issues to the developers who would be responsible for fixing them.&lt;/li&gt;
&lt;li&gt;Oversee the extraction of localizable strings.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The solution: automated code inspection for hard-coded string literals
&lt;/h3&gt;

&lt;p&gt;The localization project lead chose Qodana to streamline the code inspection process, resulting in a project with the following steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#1. Connect Qodana to TeamCity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The IntelliJ team connected Qodana to their &lt;a href="https://www.jetbrains.com/help/qodana/teamcity.html" rel="noopener noreferrer"&gt;TeamCity pipeline&lt;/a&gt; and enabled the &lt;a href="https://www.jetbrains.com/help/idea/hard-coded-string-literals.html" rel="noopener noreferrer"&gt;&lt;em&gt;Internationalization&lt;/em&gt; code inspection&lt;/a&gt; to highlight hard-coded string literals that were not extracted into properties files as required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabttc14cz7znn30zt33b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabttc14cz7znn30zt33b.png" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#2. Configure the inspection profile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the inspection profile, the team &lt;a href="https://www.jetbrains.com/help/qodana/qodana-yaml.html#Set+up+a+profile" rel="noopener noreferrer"&gt;configured the scope of the inspection&lt;/a&gt; to make sure that the platform skipped parts like legacy code, literals without alphabetic characters, and strings consisting of only whitespace.&lt;/p&gt;

&lt;p&gt;The team also made sure that TeamCity would produce a test report for each line inspected by Qodana and fail it if the string wasn’t extracted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#3. Decide on the frequency of scans&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once fully configured, Qodana was set to inspect the code every 4 hours. It was especially important that the scan was running independently on the server, as opposed to on someone’s local machine. This ultimately saved the team valuable time.&lt;/p&gt;

&lt;p&gt;The first Qodana run resulted in 10,000 failed tests in TeamCity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2F5xWCo4xt5mc1D8v5e_hbZ25hqF7-dI3Lwv4NytD00ddmXqd3unw39POav523WjOCCRiLCDKQq6cOS4RfcGgSFFqQ-X_0XCPA1yxVvRD5y6Dj9Qlu6UFUxhySnPZZqx-XtfJwanN7ginGIT4Tv-fuOWBXo0lBCFFTY4wq0UPBbcFkElIQ6n3klU0O4qM-5A" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh6.googleusercontent.com%2F5xWCo4xt5mc1D8v5e_hbZ25hqF7-dI3Lwv4NytD00ddmXqd3unw39POav523WjOCCRiLCDKQq6cOS4RfcGgSFFqQ-X_0XCPA1yxVvRD5y6Dj9Qlu6UFUxhySnPZZqx-XtfJwanN7ginGIT4Tv-fuOWBXo0lBCFFTY4wq0UPBbcFkElIQ6n3klU0O4qM-5A" width="1600" height="823"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Overview of the failed tests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FS-xGTPMyOu-zL-Ghz5Ndo8kQXVLSPvYXUYpyBIwNsfwtpRNLv2vlaN0FX-BiShb422gjiNYc0wFU3wPZcSceog4Ke7Ati8m-Jmx6_RWCbW7YAbtcEwg2dc2cem_mHfATcAo2DbLfQOz93meA9YFDmshdQKjQakys_vEHRpBLAUyHmufBBgqbJK7dkHPXnQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FS-xGTPMyOu-zL-Ghz5Ndo8kQXVLSPvYXUYpyBIwNsfwtpRNLv2vlaN0FX-BiShb422gjiNYc0wFU3wPZcSceog4Ke7Ati8m-Jmx6_RWCbW7YAbtcEwg2dc2cem_mHfATcAo2DbLfQOz93meA9YFDmshdQKjQakys_vEHRpBLAUyHmufBBgqbJK7dkHPXnQ" width="1600" height="752"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Qodana flags the hard-coded string literal remaining in the code as an error in the internationalized environment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#4. Assign tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For each of the test failures, the project lead assigned a developer to investigate and extract the hard-coded string to the properties file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FRx5p2vnkFYKL3FEF4IttKzGgE_tnAPbLX9CmFaP20U1wXgN57ramrBJvRrkxQiGIagRx5ETZl7ztDO05l6No7HK4i8hr_crkAdohkw-I_QXSmMLi-wwLdQXelFG2b2lfQu-d2nnI0OmdYUyDxBjfhRoEi-zulqVEoDcc1YvPgCUPtNmm5U7mCUNMYrtOjQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FRx5p2vnkFYKL3FEF4IttKzGgE_tnAPbLX9CmFaP20U1wXgN57ramrBJvRrkxQiGIagRx5ETZl7ztDO05l6No7HK4i8hr_crkAdohkw-I_QXSmMLi-wwLdQXelFG2b2lfQu-d2nnI0OmdYUyDxBjfhRoEi-zulqVEoDcc1YvPgCUPtNmm5U7mCUNMYrtOjQ" width="1600" height="619"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How the assigned test is displayed in TeamCity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;#5. Monitor the results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After each Qodana inspection, TeamCity compared the previous results to the current report. If the developer responsible for an issue extracted the string, TeamCity marked the test as fixed. This allowed the project lead to monitor the progress without having to manually mark tests as fixed.&lt;/p&gt;

&lt;p&gt;Additionally, the team was able to monitor progress in the Qodana Cloud dashboard, which updated information on the remaining code issues in real time and compared results between different Qodana runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6wx2odp7i9bz2zfae94.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6wx2odp7i9bz2zfae94.gif" width="760" height="408"&gt;&lt;/a&gt;&lt;br&gt;
_The Qodana Cloud dashboard example. _&lt;/p&gt;

&lt;p&gt;Qodana also allowed adding selected issues to the baseline, otherwise known as the technical debt section. This way, the entire team could see the same list of issues and monitor progress right in the platform. Below is an example of how this works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9vuz5tmmxmj1hwtywxk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9vuz5tmmxmj1hwtywxk.gif" width="720" height="392"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Qodana baseline feature.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The key outcomes
&lt;/h3&gt;

&lt;p&gt;In only a few months, the number of &lt;strong&gt;failed tests dropped from 10,000 to zero&lt;/strong&gt; , an average of about &lt;strong&gt;175 fixed tests per day&lt;/strong&gt;. The team successfully removed all hard-coded string literals from the source code and the whole UI was localized seamlessly, with no unexpected elements in English.&lt;/p&gt;

&lt;p&gt;With Qodana, the IntelliJ team required fewer manual steps in the localization process, thereby reducing the number of human errors and increasing confidence in the localized builds. Additionally, with checks running every 4 hours, they were able to detect issues sooner and prevent small problems from turning into big ones later on.&lt;/p&gt;

&lt;p&gt;Finally, Qodana became the single source of truth for the team lead, making it easy to ensure that developers fixed the problems they were assigned.&lt;/p&gt;

&lt;p&gt;Thanks to these results, the IntelliJ team will keep using Qodana as a code quality and resource planning platform when they deliver new functionalities or improve IntelliJ IDEA’s performance. More on that in our upcoming posts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/qodana" rel="noopener noreferrer"&gt;GET STARTED WITH QODANA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy developing and keep your code clean!&lt;/p&gt;

</description>
      <category>bestpractices</category>
      <category>codereview</category>
      <category>collaboration</category>
      <category>idea</category>
    </item>
  </channel>
</rss>
