{"id":586489,"date":"2025-07-30T08:41:27","date_gmt":"2025-07-30T07:41:27","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=go&#038;p=586489"},"modified":"2025-07-30T08:41:35","modified_gmt":"2025-07-30T07:41:35","slug":"analyse-interprocedurale-detecter-les-dereferences-nil-pour-eviter-le-crash-de-votre-code","status":"publish","type":"go","link":"https:\/\/blog.jetbrains.com\/fr\/go\/2025\/07\/30\/analyse-interprocedurale-detecter-les-dereferences-nil-pour-eviter-le-crash-de-votre-code\/","title":{"rendered":"Analyse interproc\u00e9durale\u00a0: d\u00e9tecter les d\u00e9r\u00e9f\u00e9rences nil pour \u00e9viter le crash de votre code"},"content":{"rendered":"\n<p>La nouvelle version GoLand 2025.2 introduit un puissant ensemble de nouvelles fonctionnalit\u00e9s et d&#8217;am\u00e9liorations con\u00e7ues pour vous aider \u00e0 \u00e9crire un code Go plus s\u00fbr et plus fiable. Pour une description d\u00e9taill\u00e9e des toutes les mises \u00e0 jour, veuillez consulter les <a href=\"https:\/\/www.jetbrains.com\/help\/go\/2025.2\/release-notes-goland.html\" target=\"_blank\" rel=\"noopener\">notes de publication<\/a>.&nbsp;<\/p>\n\n\n\n<p>Cet article est consacr\u00e9 \u00e0 l&#8217;une des nouvelles fonctionnalit\u00e9s les plus significatives de GoLand : l&#8217;analyse de code interproc\u00e9durale pour d\u00e9tecter les d\u00e9r\u00e9f\u00e9rencements des pointeurs <code>nil<\/code>. En vous aidant \u00e0 d\u00e9tecter des bugs subtils, souvent difficiles \u00e0 identifier lors des processus de r\u00e9vision et de test du code, cette am\u00e9lioration rend votre code de production plus stable et plus facile \u00e0 maintenir.<\/p>\n\n\n\n<p>L&#8217;\u00e9quipe GoLand a concentr\u00e9 ses efforts sur l&#8217;augmentation de la puissance et de l&#8217;intelligence du processus d&#8217;analyse statique, afin d&#8217;am\u00e9liorer votre exp\u00e9rience de d\u00e9veloppement et de vous \u00e9viter les moments de panique frustrants lors de l&#8217;ex\u00e9cution. Si vous souhaitez essayer cette fonctionnalit\u00e9 dans votre IDE, vous pouvez cloner le <a href=\"https:\/\/github.com\/JetBrains\/goland-documentation-samples\/tree\/main\/nilDereferenceAnalysis\" target=\"_blank\" rel=\"noopener\">projet suivant<\/a> depuis GitHub.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9r\u00e9f\u00e9rencement des pointeurs <strong><code>nil<\/code><\/strong> en Go<\/h2>\n\n\n\n<p>L&#8217;une des principales difficult\u00e9s du langage de programmation Go, \u00e0 laquelle presque tous les d\u00e9veloppeurs Go ont confront\u00e9s au moins une fois, r\u00e9side dans le d\u00e9r\u00e9f\u00e9rencement des pointeurs <code>nil<\/code>. Malgr\u00e9 la simplicit\u00e9 de Go et son typage statique fort, <code>nil<\/code> demeure une source de bugs subtils et souvent critiques.<\/p>\n\n\n\n<p>L&#8217;impact d&#8217;un d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> peut \u00eatre grave, surtout dans les environnements de production. Un seul d\u00e9r\u00e9f\u00e9rencement inattendu peut cause le crash d&#8217;un service et mettre une API ou un processus hors service avec peu de signes avant-coureurs voire aucun avertissement.&nbsp;<\/p>\n\n\n\n<p>Avec Go, des probl\u00e8mes encore plus subtils peuvent se produire. Par exemple, l&#8217;\u00e9criture dans un canal <code>nil<\/code>, par exemple, peut provoquer le blocage permanent d&#8217;une goroutine, ce qui peut g\u00e9n\u00e9rer d&#8217;autres blocages et des pannes syst\u00e8me en cascade. Tenter d&#8217;acc\u00e9der aux champs sur un pointeur <code>nil<\/code> non initialis\u00e9 entra\u00eenera une panique imm\u00e9diate. Ces types d&#8217;erreurs sont faciles \u00e0 manquer et difficiles \u00e0 d\u00e9tecter apr\u00e8s le d\u00e9ploiement.<\/p>\n\n\n\n<p>Certains probl\u00e8mes de d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> peuvent \u00eatre intercept\u00e9s au moyen d&#8217;un processus rigoureux de r\u00e9vision ou de test, mais cela n&#8217;est pas toujours suffisant. En cas de d\u00e9veloppement rapides ou de grande base de code, les bugs subtils li\u00e9s \u00e0 <code>nil<\/code> peuvent facilement passer inaper\u00e7us. Dans l&#8217;id\u00e9al, ces probl\u00e8mes devraient \u00eatre d\u00e9tect\u00e9s automatiquement et aussi t\u00f4t que possible lors de l&#8217;\u00e9criture du code.<\/p>\n\n\n\n<p>C&#8217;est ici que l&#8217;analyse statique du code entre en jeu. GoLand inclut d\u00e9j\u00e0 une inspection des d\u00e9r\u00e9f\u00e9rencements <code>nil<\/code> int\u00e9gr\u00e9e qui effectue une analyse intraproc\u00e9durale locale. Elle fonctionne bien dans de nombreux cas courants, en d\u00e9tectant lorsqu&#8217;un pointeur <code>nil<\/code> peut se trouver au niveau d&#8217;une fonction.<\/p>\n\n\n\n<p>Toutefois, l&#8217;analyse actuelle ne fonctionne que dans les fonctions individuelles. Elle ne suit pas les mouvements des valeurs entre les fonctions et peut donc passer \u00e0 c\u00f4t\u00e9 de probl\u00e8mes impliquant de multiples appels. Ces cas plus complexes sont en r\u00e9alit\u00e9 communs dans le code Go de production et sont souvent les plus dangereux. Pour les intercepter, nous avons impl\u00e9ment\u00e9 quelque chose de plus puissant : l&#8217;analyse de code interproc\u00e9durale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Analyse de code interproc\u00e9durale<\/h2>\n\n\n\n<p>L&#8217;analyse interproc\u00e9durale, \u00e9galement appel\u00e9e analyse globale, vous permet de comprendre comment les valeurs se d\u00e9placent entre les appels de fonctions. Elle va au-del\u00e0 du niveau de la fonction pour suivre les donn\u00e9es entre diff\u00e9rents fichiers et paquets. Par contraste, une analyse locale v\u00e9rifie seulement que ce qui se passe dans une seule fonction. Les probl\u00e8mes locaux sont souvent faciles \u00e0 d\u00e9tecter en examinant une seule fonction. Les probl\u00e8mes globaux sont plus difficiles \u00e0 identifier, car la source d&#8217;un probl\u00e8me, comme une valeur <code>nil<\/code>, peut \u00eatre \u00e9loign\u00e9e de l&#8217;endroit o\u00f9 l&#8217;erreur se produit. C&#8217;est pourquoi l&#8217;analyse interproc\u00e9durale est aussi utile pour d\u00e9tecter les probl\u00e8mes de d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Suivre le flux : comprendre les d\u00e9r\u00e9f\u00e9rencements <strong><code>nil<\/code><\/strong><\/h3>\n\n\n\n<p>Prenons maintenant un exemple. Ce code semble plut\u00f4t simple \u00e0 premi\u00e8re vue. Nous cr\u00e9ons un utilisateur au moyen d&#8217;un constructeur, puis nous imprimons ses champs. Mais l&#8217;analyse nous donne un avertissement : <code>user.Age<\/code> risque de causer un d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"3200\" height=\"728\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.1-main.png\" alt=\"\" class=\"wp-image-583380\"\/><\/figure>\n\n\n\n<p>Essayons d&#8217;effectuer une recherche manuellement. Pour comprendre ce qui se passe, nous devons examiner comment la fonction <code>NewUser<\/code> est impl\u00e9ment\u00e9e. Elle est d\u00e9finie dans un autre fichier appel\u00e9 <code><a href=\"http:\/\/model.go\" target=\"_blank\" rel=\"noopener\">model.go<\/a><\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"3200\" height=\"769\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.2-NewUser.png\" alt=\"\" class=\"wp-image-583435\"\/><\/figure>\n\n\n\n<p>Ce constructeur semble un peu bizarre : <code>NewUser<\/code> renvoie <code>nil<\/code> en cas d&#8217;erreur, mais dans <code>main<\/code>, nous utilisons le r\u00e9sultat sans v\u00e9rification. Cela g\u00e9n\u00e8re un d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> potentiel.<\/p>\n\n\n\n<p>Pour corriger cela, nous pouvons r\u00e9\u00e9crire <code>NewUser<\/code> pour renvoyer \u00e0 la fois un r\u00e9sultat et une erreur \u2013 le style Go le plus idiomatique.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"3200\" height=\"1666\" data-id=\"583457\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.3-main-NewUser-fix-1.png\" alt=\"\" class=\"wp-image-583457\"\/><\/figure>\n<\/figure>\n\n\n\n<p>Le code est maintenant plus s\u00fbr. Nous recherchons les erreurs potentielles avant l&#8217;acc\u00e8s \u00e0 <code>user<\/code>, ce qui \u00e9limine le risque de d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code>. Bien que ce code semble correct, nous voyons toujours le m\u00eame avertissement.<\/p>\n\n\n\n<p>Pour comprendre ce qui se passe, nous allons creuser un peu plus et regarder de pr\u00e8s l&#8217;impl\u00e9mentation de <code>CreateUser<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"3200\" height=\"988\" data-id=\"583468\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.4-CreateUser.png\" alt=\"\" class=\"wp-image-583468\"\/><\/figure>\n<\/figure>\n\n\n\n<p>C&#8217;est ici que nous trouvons la deuxi\u00e8me cause du probl\u00e8me.<\/p>\n\n\n\n<p>Dans la fonction <code>CreateUser<\/code> contient un cas dans lequel le code renvoie <code>nil<\/code> \u00e0 la fois pour <code>user<\/code> et pour <code>error<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"3200\" height=\"340\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.5-CreateUser-return-nil-nil.png\" alt=\"\" class=\"wp-image-583479\"\/><\/figure>\n\n\n\n<p>Il s&#8217;agit d&#8217;un probl\u00e8me assez courant en traitement des erreurs. Le renvoi de <code>nil<\/code> sans une erreur laisse penser que tout est correct, alors qu&#8217;en r\u00e9alit\u00e9 le r\u00e9sultat n&#8217;est pas valide. L&#8217;appelant v\u00e9rifie simplement l&#8217;erreur, voit qu&#8217;elle est <code>nil<\/code>, puis essaie d&#8217;utiliser le r\u00e9sultat. Dans notre exemple, cela entra\u00eene un crash lorsque le code acc\u00e8de \u00e0 <code>user.Age<\/code>.<\/p>\n\n\n\n<p>Nous pouvons corriger cela en renvoyant une erreur r\u00e9elle lorsque l&#8217;entr\u00e9e n&#8217;est pas valide :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"3200\" height=\"340\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.6-CreateUser-return-nil-nil-fix.png\" alt=\"\" class=\"wp-image-583490\"\/><\/figure>\n\n\n\n<p>Avec cette modification, le code est maintenant correct et l&#8217;inspection ne signale plus de d\u00e9r\u00e9f\u00e9rencement nil.<\/p>\n\n\n\n<p>La recherche manuelle de ce type de probl\u00e8me peut \u00eatre lente et frustrante, notamment dans les gros projets. L&#8217;emplacement auquel une valeur <code>nil<\/code> est cr\u00e9\u00e9e peut \u00eatre \u00e9loign\u00e9 de l&#8217;endroit o\u00f9 elle cause un probl\u00e8me.<\/p>\n\n\n\n<p>C&#8217;est pourquoi GoLand met en \u00e9vidence ces probl\u00e8mes directement dans l&#8217;\u00e9diteur d\u00e8s qu&#8217;ils sont d\u00e9tect\u00e9s. Pour ces avertissements, nous avons une action contextuelle d\u00e9di\u00e9e : <em>Explain potential nil dereference<\/em>. Cette action ouvre la fen\u00eatre d&#8217;outils <em>Data Flow Analysis<\/em>, dans laquelle vous obtenez une explication \u00e9tape par \u00e9tape de la mani\u00e8re dont la valeur <code>nil<\/code> circule dans le code et des endroits o\u00f9 elle est finalement utilis\u00e9e. Cela permet de comprendre bien plus facilement quel est le probl\u00e8me et comment le corriger sans avoir \u00e0 parcourir l&#8217;ensemble de la base de code.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-1.7-DFA-toolwindow-movie.mov\"><\/video><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Lorsque <code>nil<\/code> passe inaper\u00e7u : identifier les arguments et les r\u00e9cepteurs non s\u00fbrs<\/h3>\n\n\n\n<p>Notre analyse ne se contente pas de suivre les valeurs <code>return<\/code>. Il peut \u00e9galement faire un raisonnement sur la nillabilit\u00e9 des param\u00e8tres en comprenant si une fonction attend un argument non nil ou si elle peut accepter <code>nil<\/code> en toute s\u00e9curit\u00e9, ce qui est particuli\u00e8rement utile pour identifier les cas dans lesquels une valeur <code>nil<\/code> est transmise de fa\u00e7on non intentionnelle \u00e0 une fonction qui ne la traite pas correctement.<\/p>\n\n\n\n<p>Prenons un autre exemple :<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"3206\" height=\"756\" data-id=\"583512\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-2.1-prcoess.png\" alt=\"\" class=\"wp-image-583512\"\/><\/figure>\n<\/figure>\n\n\n\n<p>Ici, nous appelons la m\u00e9thode <code>Copy<\/code> sur un <code>user<\/code>. En m\u00eame temps, nous transmettons <code>nil<\/code> en tant que contexte, en supposant qu&#8217;il n&#8217;y a pas de risque \u00e0 faire cela.&nbsp;<\/p>\n\n\n\n<p>Mais l&#8217;inspection renvoie un avertissement : l&#8217;argument de contexte pourrait causer un d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> lors du passage d&#8217;une valeur <code>nil<\/code> comme contexte. V\u00e9rifions l&#8217;impl\u00e9mentation de la m\u00e9thode <code>Copy<\/code> :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"3206\" height=\"960\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-2.2-Copy.png\" alt=\"\" class=\"wp-image-583523\" style=\"aspect-ratio:3.339583333333333;width:840px;height:auto\"\/><\/figure>\n\n\n\n<p>Dans ce code, la m\u00e9thode acc\u00e8de \u00e0 <code>ctx.isDebugEnabled<\/code> sans v\u00e9rifier si <code>ctx<\/code> est <code>nil<\/code>. Si <code>ctx<\/code> est <code>nil<\/code>, le programme paniquera lors de l&#8217;ex\u00e9cution.<\/p>\n\n\n\n<p>Pour corriger cela, nous pouvons rendre le param\u00e8tre <code>ctx<\/code> \u00ab nil-safe \u00bben ajoutant une v\u00e9rification <code>nil<\/code> explicite avant d&#8217;acc\u00e9der \u00e0 ses champs.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-7 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"3206\" height=\"324\" data-id=\"583534\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-2.3-Copy-ctx-fix.png\" alt=\"\" class=\"wp-image-583534\"\/><\/figure>\n<\/figure>\n\n\n\n<p>Avec cette modification, le code devient s\u00fbr et l&#8217;avertissement au niveau du site d&#8217;appel dispara\u00eet.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-9 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"3206\" height=\"848\" data-id=\"583545\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-2.4-process.png\" alt=\"\" class=\"wp-image-583545\"\/><\/figure>\n<\/figure>\n\n\n\n<p>Toutefois, cela n&#8217;est pas le seul probl\u00e8me. L&#8217;analyse signale \u00e9galement un d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> potentiel en relation avec la variable <code>user<\/code>.<\/p>\n\n\n\n<p>Pour comprendre pourquoi, nous pouvons utiliser l&#8217;action <em>Explain potential nil dereference<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-2.5-DFA-toolwindow-movie.mov\"><\/video><\/figure>\n\n\n\n<p>La fonction <code>process<\/code> permet \u00e0 <code>user<\/code> d&#8217;\u00eatre <code>nil<\/code> et nous le transmettons \u00e0 <code>Copy<\/code> sans v\u00e9rification.&nbsp;<\/p>\n\n\n\n<p>Dans la m\u00e9thode <code>Copy<\/code>, le r\u00e9cepteur <code>u<\/code> est utilis\u00e9 avant d&#8217;\u00eatre v\u00e9rifi\u00e9. Plus sp\u00e9cifiquement, <code>u<\/code> est transmise \u00e0 la fonction <code>logUserEvent<\/code>, o\u00f9 un d\u00e9r\u00e9f\u00e9rencement se produit lors de l&#8217;acc\u00e8s au champ <code>u.Name<\/code>. Par cons\u00e9quent, si la variable <code>user<\/code> de la fonction <code>process<\/code> est <code>nil<\/code>, un d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> se produira.<\/p>\n\n\n\n<p>Ces exemples d\u00e9montrent que les probl\u00e8mes de d\u00e9r\u00e9f\u00e9rencement <code>nil<\/code> sont souvent subtils et peuvent facilement passer inaper\u00e7us. M\u00eame si le code semble propre et idiomatique, supposer qu&#8217;il n&#8217;y a aucun probl\u00e8me peut conduire \u00e0 n crash lors de l&#8217;ex\u00e9cution. Retrouver la cause premi\u00e8re manuellement peut s&#8217;av\u00e9rer \u00e9tonnamment compliqu\u00e9, surtout lorsque l&#8217;origine de la valeur <code>nil<\/code> est loin de l&#8217;endroit o\u00f9 elle est utilis\u00e9e, s\u00e9par\u00e9e du d\u00e9r\u00e9f\u00e9rencement par plusieurs appels de fonctions, fichiers ou paquets.<\/p>\n\n\n\n<p>C&#8217;est ici que l&#8217;analyse interproc\u00e9durale se r\u00e9v\u00e8le utile. Elle suit la fa\u00e7on dont les valeurs <code>nil<\/code> circulent au fil des appels de fonction. Au lieu de devoir deviner o\u00f9 le probl\u00e8me a commenc\u00e9, vous pouvez voir clairement le chemin complet, de l&#8217;origine au point de d\u00e9r\u00e9f\u00e9rencement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La documentation rapide montre d\u00e9sormais des informations sur la nillabilit\u00e9<\/h2>\n\n\n\n<p>L&#8217;analyse de nillabilit\u00e9 dans GoLand ne consiste pas seulement \u00e0 mettre en \u00e9vidence des probl\u00e8mes dans l&#8217;\u00e9diteur. Comme vous l&#8217;avez d\u00e9j\u00e0 vu, notre analyse permet de d\u00e9terminer si une fonction peut renvoyer <code>nil<\/code> et s&#8217;il est s\u00fbr de transmettre <code>nil<\/code> comme argument \u00e0 un param\u00e8tre particulier. Comme l&#8217;analyse comprend comment les fonctions sont cens\u00e9es se comporter, nous avons d\u00e9cid\u00e9 de rendre ces informations facilement accessibles. C&#8217;est pourquoi nous avons int\u00e9gr\u00e9 des informations sur la nillabilit\u00e9 directement dans la fen\u00eatre contextuelle de documentation rapide<strong><\/strong>.<\/p>\n\n\n\n<p>Revenons \u00e0 notre premier exemple, avant l&#8217;application des correctifs. Si nous pla\u00e7ons le curseur sur la fonction <code>NewUser<\/code> et d\u00e9clenchons la<em> <\/em>documentation rapide, cela affiche la section <em>Nilability info<\/em>, qui indique le risque de nillabilit\u00e9 des param\u00e8tres de la fonction et de la valeur <code>return<\/code>. Dans cet exemple, la fonction peut renvoyer un r\u00e9sultat <code>nil<\/code> et la fen\u00eatre contextuelle de documentation rapide nous l&#8217;indique clairement.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"3206\" height=\"962\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-3.1-quick-documentation-NewUser.png\" alt=\"\" class=\"wp-image-583567\"\/><\/figure>\n\n\n\n<p>La m\u00eame fonctionnalit\u00e9 existe pour les param\u00e8tres et les r\u00e9cepteurs. Dans le deuxi\u00e8me exemple, \u00e9galement avant d&#8217;appliquer les correctifs, la section <em>Nilability info<\/em> montre que le r\u00e9cepteur <code>u<\/code> et le param\u00e8tre <code>ctx<\/code> de la fonction sont cens\u00e9s ne pas \u00eatre nil.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-11 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"3206\" height=\"1346\" data-id=\"583578\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Example-3.2-quick-documentation-Copy.png\" alt=\"\" class=\"wp-image-583578\"\/><\/figure>\n<\/figure>\n\n\n\n<p>Ce petit ajout fait une grande diff\u00e9rence. Une recherche rapide permet d&#8217;avoir un aper\u00e7u des d\u00e9tails importants, ce qui peut vous aider \u00e0 \u00e9crire un code plus s\u00fbr et \u00e0 r\u00e9duire les risques de d\u00e9r\u00e9f\u00e9rencements <code>nil<\/code> impr\u00e9vus. Toutefois, gardez \u00e0 l&#8217;esprit que tous les cas ne sont pas couverts par l&#8217;analyse et qu&#8217;il faut toujours v\u00e9rifier le code soigneusement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Limitations et contraintes<\/h2>\n\n\n\n<p>La premi\u00e8re version de cette analyse est volontairement simple et prudente. Elle n&#8217;essaye pas de d\u00e9tecter tous les d\u00e9r\u00e9f\u00e9rencements <code>nil<\/code> possibles. Nous nous sommes intentionnellement focalis\u00e9s sur les cas les plus courants et les plus importants, avec pour objectif de maintenir le nombre de faux positifs au minimum. Nous allons poursuivre l&#8217;am\u00e9lioration de l&#8217;analyse au fil du temps, en ajoutant de nouveaux cas avec pr\u00e9caution. Notre objectif est de d\u00e9tecter rapidement autant de probl\u00e8mes que possible sans que cela ne vienne parasiter votre activit\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c9viter la panique, assurer la s\u00e9curit\u00e9<\/h2>\n\n\n\n<p>L&#8217;analyse de code interproc\u00e9durale facilite consid\u00e9rablement l&#8217;interception et la correction en amont des probl\u00e8mes de d\u00e9r\u00e9f\u00e9rencement du pointeur <code>nil<\/code>. En suivant les valeurs <code>nil<\/code> entre les fonctions, les fichiers et les paquets, cette analyse permet de mieux comprendre les causes premi\u00e8res des bugs potentiels avant la phase de production, afin de r\u00e9duire les temps d&#8217;arr\u00eat et de pr\u00e9venir les incidents co\u00fbteux.&nbsp;<\/p>\n\n\n\n<p>Nous avons h\u00e2te de poursuivre l&#8217;am\u00e9lioration et l&#8217;enrichissement de ces fonctionnalit\u00e9s dans les futures mises \u00e0 jour. Restez \u00e0 l&#8217;\u00e9coute, et comme toujours, vos retours d&#8217;exp\u00e9rience et avis sont les bienvenus !<\/p>\n\n\n\n<p><em>L&#8217;\u00c9quipe GoLand<\/em><\/p>\n\n\n\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n\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:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/07\/Me.png\" width=\"200\" height=\"200\" alt=\"Arseniy Terekhov\" 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                                            <h4>Arseniy Terekhov<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":585281,"comment_status":"closed","ping_status":"closed","template":"","categories":[808],"tags":[8850],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/go\/586489"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/go"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/go"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=586489"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/go\/586489\/revisions"}],"predecessor-version":[{"id":586850,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/go\/586489\/revisions\/586850"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/585281"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=586489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=586489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=586489"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=586489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}