{"id":309989,"date":"2022-12-22T20:37:03","date_gmt":"2022-12-22T19:37:03","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=qodana&#038;p=309989"},"modified":"2022-12-22T20:37:05","modified_gmt":"2022-12-22T19:37:05","slug":"saiu-o-qodana-2022-3-eap-qodana-para-net-e-go-e-mais-de-100-novas-inspecoes","status":"publish","type":"qodana","link":"https:\/\/blog.jetbrains.com\/pt-br\/qodana\/2022\/12\/saiu-o-qodana-2022-3-eap-qodana-para-net-e-go-e-mais-de-100-novas-inspecoes\/","title":{"rendered":"Saiu o Qodana 2022.3 EAP: Qodana para .NET e Go, e mais de 100 novas inspe\u00e7\u00f5es"},"content":{"rendered":"<p>\u00a0<\/p>\n<p>Temos o prazer de anunciar o lan\u00e7amento do Qodana 2022.3 EAP. Esta vers\u00e3o da plataforma oferece suporte para <strong>.NET<\/strong> e <strong>Go<\/strong>. Tamb\u00e9m adicionamos mais de 100 novas inspe\u00e7\u00f5es para as linguagens que j\u00e1 tinham suporte. Por\u00e9m, as imagens do Qodana 2022.2 s\u00e3o mais est\u00e1veis, pois o Qodana 2022.3 EAP ainda est\u00e1 no est\u00e1gio inicial.<\/p>\n<p>\u00a0<\/p>\n<p>Continue lendo para saber mais e tornar-se um usu\u00e1rio pioneiro de alguns novos recursos empolgantes!<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-292996\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/Featured_image_1280x600_Qodana.png\" alt=\"\" width=\"2560\" height=\"1200\" \/><\/figure>\n<p>\u00a0<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/qodana\" target=\"_blank\" rel=\"noopener\"><br \/>INTRODU\u00c7\u00c3O AO QODANA<br \/><\/a><\/p>\n<p>\u00a0<\/p>\n<p>Nossos nov\u00edssimos linters trazem todos os recursos do <a href=\"https:\/\/www.jetbrains.com\/rider\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rider<\/a> e do <a href=\"https:\/\/www.jetbrains.com\/go\/\" target=\"_blank\" rel=\"noreferrer noopener\">GoLand<\/a> para permitir que voc\u00ea identifique c\u00f3digo an\u00f4malo e bugs em potencial, elimine c\u00f3digo in\u00fatil, melhore a estrutura geral do c\u00f3digo e introduza as melhores pr\u00e1ticas por todos os seus projetos de .NET e Go!<\/p>\n<p>\u00a0<\/p>\n<h2>Qodana para .NET<\/h2>\n<p>\u00a0<\/p>\n<p>O Qodana d\u00e1 suporte a quase todas as inspe\u00e7\u00f5es de .NET oferecidas pelo Rider. Como a lista dessas inspe\u00e7\u00f5es \u00e9 longa, confira a <a href=\"https:\/\/www.jetbrains.com\/help\/rider\/Code_Analysis__Code_Inspections.html\" target=\"_blank\" rel=\"noreferrer noopener\">documenta\u00e7\u00e3o do Rider<\/a> para saber mais sobre todas as inspe\u00e7\u00f5es. Enquanto isso, veja abaixo alguns exemplos das inspe\u00e7\u00f5es de .NET que o Qodana pode executar.<\/p>\n<p>\u00a0<\/p>\n<p><strong>Ordena\u00e7\u00e3o de locks inconsistentes<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Um dos maiores problemas ao se usar locks para garantir a seguran\u00e7a das threads \u00e9 evitar travamentos m\u00fatuos, ou seja, quando as threads simultaneamente impedem umas \u00e0s outras de continuar a execu\u00e7\u00e3o, de modo que esta n\u00e3o avan\u00e7a. Com esta nova inspe\u00e7\u00e3o, o Qodana real\u00e7a os ciclos que puderem levar a poss\u00edveis travamentos m\u00fatuos em tempo de execu\u00e7\u00e3o.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293018\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/1-NET-order-of-locks.png\" alt=\"\" width=\"1776\" height=\"804\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Acesso a vari\u00e1veis capturadas modificadas<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>O Qodana para .NET detecta acessos a vari\u00e1veis capturadas a partir de um m\u00e9todo an\u00f4nimo, quando essas vari\u00e1veis forem modificadas externamente.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293029\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/2-NET-access-to-modified.png\" alt=\"\" width=\"1772\" height=\"570\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Evitar usar express\u00f5es lambda &#8220;async&#8221; quando o tipo Delegate retornar &#8220;void&#8221;<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o detecta o uso de express\u00f5es lambda &#8220;async&#8221;. Se houver quaisquer exce\u00e7\u00f5es n\u00e3o tratadas pela express\u00e3o lambda, elas nunca afetar\u00e3o a thread que fez a chamada e n\u00e3o ser\u00e3o pegas pela cl\u00e1usula &#8220;catch&#8221;.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293040\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/3-NET-Avoid-async-lambda.png\" alt=\"\" width=\"1766\" height=\"650\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Verifica\u00e7\u00f5es de tipo e casts podem ser combinados<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>O operador de teste de tipo <code>is<\/code>, na sua forma cl\u00e1ssica <code>(Express\u00e3o is Tipo)<\/code>, retornar\u00e1 <code>verdadeiro<\/code> apenas quando o tipo de execu\u00e7\u00e3o da <code>Express\u00e3o<\/code> for compat\u00edvel com o <code>Tipo<\/code> e o resultado da <code>Express\u00e3o<\/code> n\u00e3o for <code>null<\/code>.<\/p>\n<p>\u00a0<\/p>\n<p>Quando se usa <code>is<\/code> para verificar a compatiblidade antes do casting, como no exemplo abaixo, encontramos pelo menos dois problemas:<\/p>\n<p>\u00a0<\/p>\n<ul>\n<li>A verifica\u00e7\u00e3o de tipo \u00e9 executada duas vezes sem necessidade, o que pode afetar o desempenho, se isto for feito dentro de um loop.<\/li>\n<li>O fato de que a execu\u00e7\u00e3o do programa n\u00e3o chegar\u00e1 ao comando <code>if<\/code> se <code>obj<\/code> for <code>null<\/code> n\u00e3o fica imediatamente claro para quem est\u00e1 lendo o c\u00f3digo.<\/li>\n<\/ul>\n<p>O Qodana detectar\u00e1 esse problema e sugerir\u00e1 que voc\u00ea o corrija no Rider.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293051\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/4-NET-Merge-cast.png\" alt=\"\" width=\"1748\" height=\"510\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Uma express\u00e3o lambda ou m\u00e9todo an\u00f4nimo n\u00e3o deve ter capturas do contexto externo<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Uma express\u00e3o lambda ou m\u00e9todo an\u00f4nimo passado a um par\u00e2metro anotado pelo atributo &#8220;[RequireStaticDelegate]&#8221; n\u00e3o deve ter capturas do contexto que o cont\u00e9m (vari\u00e1veis e fun\u00e7\u00f5es locais, refer\u00eancias &#8220;this&#8221;), para evitar aloca\u00e7\u00f5es de heap.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293062\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/5-NET-Lambda.png\" alt=\"\" width=\"1768\" height=\"676\" \/><\/figure>\n<p>\u00a0<\/p>\n<p>Para configurar o linter para .NET e executar an\u00e1lises, consulte a <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/2022.3\/qodana-dotnet-docker-readme.html\" target=\"_blank\" rel=\"noreferrer noopener\">documenta\u00e7\u00e3o do Qodana<\/a>.<\/p>\n<p>\u00a0<\/p>\n<h2>Qodana para Go<\/h2>\n<p>\u00a0<\/p>\n<p>O Qodana 2022.3 foi projetado para dar suporte a todas as inspe\u00e7\u00f5es oferecidas pelo GoLand. Para ver a lista completa dessas inspe\u00e7\u00f5es, consulte a <a href=\"https:\/\/www.jetbrains.com\/help\/go\/code-inspections-in-go.html\" target=\"_blank\" rel=\"noreferrer noopener\">documenta\u00e7\u00e3o do GoLand<\/a>. Veja abaixo alguns exemplos de inspe\u00e7\u00f5es do Go que agora t\u00eam suporte no Qodana.<\/p>\n<p>\u00a0<\/p>\n<p><strong>Placeholder argument \u2018d.DeletedCount\u2019 has the wrong type \u2018int64\u2019 (%s)<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o alerta para usos incorretos de <code>fmt.Printf<\/code>, <code>fmt.Println<\/code> e outras fun\u00e7\u00f5es semelhantes de formata\u00e7\u00e3o e impress\u00e3o.<\/p>\n<p>\u00a0<\/p>\n<p>Em suas strings de formato, fun\u00e7\u00f5es de formata\u00e7\u00e3o usam verbos de formata\u00e7\u00e3o, como <code>%s<\/code>, <code>%d<\/code>, <code>%v<\/code> e outros.<\/p>\n<p>\u00a0<\/p>\n<p>Se esses verbos de formata\u00e7\u00e3o forem usados incorretamente, o resultado de uma fun\u00e7\u00e3o de formata\u00e7\u00e3o conter\u00e1 um erro.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293073\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/6-Go-placeholder.png\" alt=\"\" width=\"1718\" height=\"548\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Unhandled error<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o alerta para chamadas a fun\u00e7\u00f5es e m\u00e9todos que n\u00e3o s\u00e3o capazes de tratar o resultado de chamadas do tipo <code>error<\/code>.<\/p>\n<p>\u00a0<\/p>\n<p>Uma API dessas fun\u00e7\u00f5es implica que sua execu\u00e7\u00e3o pode terminar em falha e retornar um erro. Chamadas que n\u00e3o tratam resultados que cont\u00eam erros podem ser uma indica\u00e7\u00e3o de mau uso da API.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293084\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/7-Go-Unhandled.png\" alt=\"\" width=\"1718\" height=\"464\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Unused dependency<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o alerta para depend\u00eancias sem uso no seu projeto. \u00c9 uma boa pr\u00e1tica verificar regularmente a exist\u00eancia de depend\u00eancias n\u00e3o usadas, pois isso reduz o tamanho das bibliotecas do seu projeto e facilita a manuten\u00e7\u00e3o.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293095\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/8-Go-unused.png\" alt=\"\" width=\"1594\" height=\"484\" \/><\/figure>\n<p>\u00a0<\/p>\n<p>Para ver o Qodana em a\u00e7\u00e3o e brincar com essas novas inspe\u00e7\u00f5es, fique \u00e0 vontade para mergulhar na nossa documenta\u00e7\u00e3o e ver como configurar linters para o <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/2022.3\/qodana-go-docker-readme.html\" target=\"_blank\" rel=\"noreferrer noopener\">Go<\/a>.<\/p>\n<p>\u00a0<\/p>\n<h2>Novas inspe\u00e7\u00f5es<\/h2>\n<p>\u00a0<\/p>\n<p>Al\u00e9m de adicionar novos linters para .NET e Go, o Qodana 2022.3 tamb\u00e9m traz mais de 100 novas inspe\u00e7\u00f5es para os linters j\u00e1 existentes. Vamos dar uma olhada nos exemplos de maior destaque das inspe\u00e7\u00f5es para Java, Kotlin e Python.<\/p>\n<p>\u00a0<\/p>\n<h3>Inspe\u00e7\u00f5es Java e Kotlin<\/h3>\n<p>\u00a0<\/p>\n<p>Adicionamos mais de 40 novas inspe\u00e7\u00f5es ao Qodana para JVM Community e o Qodana para JVM.<\/p>\n<p>\u00a0<\/p>\n<p><strong>DataFlowIssue<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o alerta para construtos de c\u00f3digo que sempre violam contratos de nulidade poss\u00edvel, podem criar exce\u00e7\u00f5es ou s\u00e3o redundantes, com base em uma an\u00e1lise do fluxo de dados.<\/p>\n<p>\u00a0<\/p>\n<p><strong>EscapedSpace<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>O Java 15 introduziu a sequ\u00eancia de escape s em strings para tornar vis\u00edveis espa\u00e7os em branco ao final de blocos de texto. Na maioria dos outros contextos, especialmente em express\u00f5es regulares, esta sequ\u00eancia de escape pode ser confundida facilmente com o <code>s<\/code> de uma express\u00e3o regular, que significa um espa\u00e7o em branco. Nos literais de strings em Java, ele tem que ser grafado como <code>\\s<\/code>, para diferenciar.<\/p>\n<p>\u00a0<\/p>\n<p><strong>MismatchedJavadocCode<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o alerta para casos em que o Javadoc de um m\u00e9todo contradiz de forma \u00f3bvia a assinatura do m\u00e9todo, como, por exemplo, um coment\u00e1rio dizendo que &#8220;retorna verdadeiro&#8221; quando o m\u00e9todo retorna uma string.<\/p>\n<p>\u00a0<\/p>\n<p><strong>Destructure<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspe\u00e7\u00e3o alerta para declara\u00e7\u00f5es em Kotlin que podem ser desestruturadas.<\/p>\n<p>\u00a0<\/p>\n<p><strong>UnresolvedRestParam<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Agora o Qodana pode detectar declara\u00e7\u00f5es inconsistentes de m\u00e9todos em servi\u00e7os REST (tais como par\u00e2metros <code>@PathParam<\/code> que n\u00e3o correspondem a um placeholder da anota\u00e7\u00e3o <code>@Get<\/code>), pois essas declara\u00e7\u00f5es gerariam exce\u00e7\u00f5es em tempo de execu\u00e7\u00e3o.\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><strong>ReactiveStreamsThrowInOperator<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta nova inspe\u00e7\u00e3o detecta declara\u00e7\u00f5es <code>throw<\/code> em c\u00f3digo de operador de Reactor\/RxJava, em vez de retornar valores de erros determinados, o que evita que os erros continuem a ser processados. Por exemplo, a inspe\u00e7\u00e3o ignora esses erros ou os muda para um valor substituto padr\u00e3o.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>Observe que esta vers\u00e3o do Qodana tamb\u00e9m traz todas as novas inspe\u00e7\u00f5es para Android do IntelliJ IDEA 2022.3 e do Android Studio \u2014 Electric Eel | 2022.1.1.<\/p>\n<p>\u00a0<\/p>\n<h3>Inspe\u00e7\u00f5es para Python<\/h3>\n<p>\u00a0<\/p>\n<p>Tamb\u00e9m adicionamos ao Qodana para Python algumas inspe\u00e7\u00f5es para o Google App Engine. Essas inspe\u00e7\u00f5es real\u00e7ar\u00e3o problemas antes que eles causem falhas em ambientes de produ\u00e7\u00e3o. Por exemplo, agora voc\u00ea pode detectar:<\/p>\n<p>\u00a0<\/p>\n<ul>\n<li>Consultas GQL que n\u00e3o obedecem as restri\u00e7\u00f5es de consultas permitidas no servidor do Google App Engine.<\/li>\n<li>Consultas GQL sem \u00edndices.<\/li>\n<li>Usos de recursos do Python que s\u00e3o restritos pela sandbox do Google App Engine.<\/li>\n<li>Casos em que &#8220;threadsafe&#8221; n\u00e3o est\u00e1 habilitado no tratador de CGI.<\/li>\n<\/ul>\n<p>Para excluir determinadas inspe\u00e7\u00f5es da sua an\u00e1lise, voc\u00ea pode personalizar seu perfil de inspe\u00e7\u00e3o padr\u00e3o ou criar um novo. Talvez voc\u00ea tamb\u00e9m queira impor inspe\u00e7\u00f5es que forem importantes para as suas diretrizes de programa\u00e7\u00e3o. Confira nossa <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-yaml.html#Include+an+inspection+into+the+analysis+scope\" target=\"_blank\" rel=\"noreferrer noopener\">Documenta\u00e7\u00e3o do Qodana<\/a> para obter mais informa\u00e7\u00f5es.<\/p>\n<p>\u00a0<\/p>\n<p>Isso \u00e9 tudo a respeito do Qodana 2022.3 EAP! Esperamos que voc\u00ea goste desta nova vers\u00e3o. Se voc\u00ea tiver alguma sugest\u00e3o para futuros temas de blog ou se quiser saber mais sobre como o Qodana pode ajudar voc\u00ea e a sua empresa, poste um coment\u00e1rio aqui, marque-nos no <a href=\"https:\/\/twitter.com\/Qodana\" target=\"_blank\" rel=\"noreferrer noopener\">Twitter<\/a> ou entre em contato conosco em <a href=\"mailto:qodana-support@jetbrains.com\">qodana-support@jetbrains.com<\/a>.<\/p>\n<p>\u00a0<\/p>\n<p>Bom desenvolvimento e mantenha seu c\u00f3digo limpo!<\/p>\n<p>\u00a0<\/p>\n<p><em>A equipe do Qodana<br \/><br \/>Artigo original em ingl\u00eas por:<br \/><br \/><\/em><\/p>\n<p>\u00a0<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":293124,"comment_status":"closed","ping_status":"closed","template":"","categories":[5088,4113,89,907],"tags":[477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/qodana\/309989"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/qodana"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/qodana"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=309989"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/qodana\/309989\/revisions"}],"predecessor-version":[{"id":309993,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/qodana\/309989\/revisions\/309993"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/293124"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=309989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=309989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=309989"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=309989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}