{"id":6958,"date":"2011-05-27T10:56:01","date_gmt":"2011-05-27T08:56:01","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6958"},"modified":"2011-05-27T10:56:29","modified_gmt":"2011-05-27T08:56:29","slug":"xcode-4-scopriamo-come-possiamo-usare-lanalizzatore-statico-per-trovare-alcuni-bug-nel-nostro-codice","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/xcode-4-scopriamo-come-possiamo-usare-lanalizzatore-statico-per-trovare-alcuni-bug-nel-nostro-codice\/","title":{"rendered":"Xcode 4: scopriamo come possiamo usare l&#8217;analizzatore statico per trovare alcuni bug nel nostro codice"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/Xcode-4-devAPP-icona.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/Xcode-4-devAPP-icona.png\" alt=\"Xcode-4-devAPP-icona\" title=\"Xcode-4-devAPP-icona\" width=\"175\" height=\"175\" class=\"alignleft size-full wp-image-6636\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/Xcode-4-devAPP-icona.png 175w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/Xcode-4-devAPP-icona-150x150.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/Xcode-4-devAPP-icona-92x92.png 92w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/Xcode-4-devAPP-icona-64x64.png 64w\" sizes=\"auto, (max-width: 175px) 100vw, 175px\" \/><\/a> Alcuni anni fa, durante la tesi universitaria, mi ero occupato di analisi statica, un argomento che mi \u00e8 sempre stato a cuore. Ma di che cosa si tratta?<\/p>\n<p>L&#8217;<strong>analisi statica<\/strong>, in generale, \u00e8 una tecnica automatica che deduce dei risultati \u201cinteressanti\u201d dallo studio del codice del programma, sia esso il codice sorgente, il bytecode, il codice oggetto, o qualunque altra rappresentazione intermedia generata dal compilatore. L\u2019analisi statica normalmente \u00e8 eseguita appena prima della fase di compilazione, per questo si dice che \u00e8 eseguita a compile time. Essa si contrappone alle analisi dinamiche compiute a run time, cio\u00e8 durante l\u2019esecuzione del programma.<\/p>\n<p>Senza dilunguarci troppo, la cosa fondamentale da comprendere \u00e8 che l&#8217;analisi statica permette di raccogliere informazioni riguardo al comportamento di un programma in fase di esecuzione senza che questo venga realmente eseguito. Essa \u00e8 adoperata per moltissimi scopi: dai compilatori per generare codice pi\u00f9 performante e compatto, ai sistemi (come quello che vediamo in questo articolo) che permettono di ricercare in automatico dei bug nei codici sorgente.<!--more--><\/p>\n<p>A partire dalla versione 3.2, \u00e8 stato integrato in Xcode un analizzatore statico open source di alta qualit\u00e0 denominato <strong>Clang Static Analyzer<\/strong>. Esso, collegandosi al front end Clang del compilatore LLVM, permette di trovare alcuni problemi nei file sorgente C e Objective C direttamente a compile time (quindi senza dover eseguire il programma), mostrandoli in modo analogo ai warning o agli errori di compilazione:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01.jpg\" alt=\"XCode-4-analizzatore-statico-01\" title=\"XCode-4-analizzatore-statico-01\" width=\"550\" height=\"127\" class=\"aligncenter size-full wp-image-6961\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01-300x69.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01-150x34.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>In questo articolo vedremo come sfruttare questo potente strumento e, soprattutto, che cosa possiamo aspettarci da lui.<\/p>\n<h4>Come faccio a lanciare Clang Static Analyzer sul mio codice?<\/h4>\n<p>Niente di pi\u00f9 semplice. In Xcode 4 basta scegliere Product > Analyze:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-02.jpg\" alt=\"XCode-4-analizzatore-statico-02\" title=\"XCode-4-analizzatore-statico-02\" width=\"412\" height=\"258\" class=\"aligncenter size-full wp-image-6962\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-02.jpg 412w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-02-300x187.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-02-150x93.jpg 150w\" sizes=\"auto, (max-width: 412px) 100vw, 412px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>L&#8217;analizzatore statico \u00e8 davvero ben integrato in Xcode: non dobbiamo usare un tool separato e possiamo richiamarlo con una singola scorciatoia da tastiera (\u21e7\u2318B). Inoltre:<\/p>\n<ul>\n<li>Funziona sia sui progetti Mac sia su quelli iOS (iPhone e iPad).<\/li>\n<li>Non richiede alcuno sforzo per predisporre il codice sorgente all\u2019analisi.<\/li>\n<li>E&#8217; veloce (appena un poco pi\u00f9 lento della semplice compilazione).<\/li>\n<li>Genera dei resoconti di semplice comprensione.<\/li>\n<\/ul>\n<p>L&#8217;analisi statica viene effettuata sulla configurazione di debug. Eventualmente possiamo eseguirla su un&#8217;altra configurazione andando nella pagina Edit Scheme:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-03.jpg\" alt=\"XCode-4-analizzatore-statico-03\" title=\"XCode-4-analizzatore-statico-03\" width=\"500\" height=\"342\" class=\"aligncenter size-full wp-image-6963\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-03.jpg 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-03-300x205.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-03-150x102.jpg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Che tipo di problemi trova?<\/h4>\n<p>Clang Static Analyzer identifica questi problemi:<\/p>\n<ul>\n<li><strong>Errori logici<\/strong> (lettura di variabili non inizializzate, deferenziazione di puntatori a null, divisioni per zero, codice mai eseguito, attributi mai utilizzati, etc.).\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01.jpg\" alt=\"XCode-4-analizzatore-statico-01\" title=\"XCode-4-analizzatore-statico-01\" width=\"550\" height=\"127\" class=\"aligncenter size-full wp-image-6961\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01-300x69.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-01-150x34.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/li>\n<li><strong>Errori nella gestione della memoria<\/strong> (memory leak, implementazione errata del metodo dealloc, etc.).\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-05.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-05.jpg\" alt=\"XCode-4-analizzatore-statico-05\" title=\"XCode-4-analizzatore-statico-05\" width=\"537\" height=\"141\" class=\"aligncenter size-full wp-image-6964\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-05.jpg 537w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-05-300x78.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-05-150x39.jpg 150w\" sizes=\"auto, (max-width: 537px) 100vw, 537px\" \/><\/a><br \/>\n<\/center><\/li>\n<li><strong>Mancato rispetto di linee guida o convenzioni importanti<\/strong> (metodo il cui nome non inizia con init o copy che restituisce un oggetto non autoreleased, etc.).\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-06.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-06.jpg\" alt=\"XCode-4-analizzatore-statico-06\" title=\"XCode-4-analizzatore-statico-06\" width=\"550\" height=\"138\" class=\"aligncenter size-full wp-image-6965\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-06.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-06-300x75.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-06-150x37.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/li>\n<\/ul>\n<p>Le segnalazioni pi\u00f9 utili sono sicuramente quelle relative agli errori nella gestione della memoria, che possono capitare anche agli sviluppatori pi\u00f9 esperti e attenti.<\/p>\n<h4>Come faccio a trovare la causa di un problema segnalato?<\/h4>\n<p>Pu\u00f2 capitare che a volte una segnalazione non sia del tutto autoesplicativa. C&#8217;\u00e8 un trucco, poco conosciuto, per farci aiutare dallo stesso Clang Static Analyzer. Per vederlo, facciamo un esempio concreto:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-07.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-07.jpg\" alt=\"XCode-4-analizzatore-statico-07\" title=\"XCode-4-analizzatore-statico-07\" width=\"550\" height=\"172\" class=\"aligncenter size-full wp-image-6966\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-07.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-07-300x93.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-07-150x46.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Il problema \u00e8 banale: nella riga 21 viene copiata la NSMutableString che poi viene assegnata ad una NSString che non viene mai rilasciata. Per un attimo per\u00f2 facciamo finta di non averlo ancora capito. Per prima cosa facciamo click sull&#8217;icona blu appena a sinistra del messaggio di warning:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-08.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-08.jpg\" alt=\"XCode-4-analizzatore-statico-08\" title=\"XCode-4-analizzatore-statico-08\" width=\"550\" height=\"172\" class=\"aligncenter size-full wp-image-6967\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-08.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-08-300x93.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-08-150x46.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come per magia viene espanso il flusso logico che evidenzia ci\u00f2 che l&#8217;analizzatore ha trovato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-09.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-09.jpg\" alt=\"XCode-4-analizzatore-statico-09\" title=\"XCode-4-analizzatore-statico-09\" width=\"550\" height=\"209\" class=\"aligncenter size-full wp-image-6968\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-09.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-09-300x113.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-09-150x56.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La causa del problema diventa evidente: alla riga 21 il metodo copy restituisce un oggetto con retain count a 1, che per\u00f2 non viene mai rilasciato.<\/p>\n<p>Se le frecce ci sembrano confusionarie, possiamo affidarci alla barra che compare appena sotto la jump bar e che permette di andare avanti passo passo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-10.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-10.jpg\" alt=\"XCode-4-analizzatore-statico-10\" title=\"XCode-4-analizzatore-statico-10\" width=\"550\" height=\"209\" class=\"aligncenter size-full wp-image-6969\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-10.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-10-300x113.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/05\/XCode-4-analizzatore-statico-10-150x56.jpg 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Niente male, non \u00e8 vero?<\/p>\n<h4>Ma quanto \u00e8 affidabile?<\/h4>\n<p>L&#8217;analisi statica, per sua natura, <strong>non potr\u00e0 mai essere perfetta<\/strong>, perch\u00e9 deve necessariamente compiere alcune approssimazioni. Quindi, per quanto si usino tool sofisticati, ci saranno sempre dei bug che non potranno essere rilevati (<strong>falsi negativi<\/strong>) o, viceversa, delle segnalazioni su codice corretto (<strong>falsi positivi<\/strong>).<\/p>\n<p>Detto questo, perch\u00e9 un analizzatore sia utile nella pratica, deve mostrare il minor numero di falsi positivi, per non richiederci un massiccio lavoro di filtraggio, e di falsi negativi, perch\u00e9 in caso contrario potremmo avvertire un falso senso di sicurezza (che in alcuni casi \u00e8 perfino pi\u00f9 pericoloso della presenza accertata di problemi).<\/p>\n<p>Clang Static Analyzer, da questo punto di vista, <strong>\u00e8 sicuramente molto valido<\/strong>. Per questo a parer mio dobbiamo abituarci ad usarlo con regolarit\u00e0 e a rendere il nostro codice &#8220;warning free&#8221;: se, attraverso l&#8217;analizzatore statico, individuiamo un bug molto presto, potremo risparmiare parecchio tempo durante i test, quando le cause degli errori sono pi\u00f9 difficili da individuare.<\/p>\n<p>E&#8217; interessante osservare che <strong>l&#8217;analizzatore statico considera ogni possibile flusso di esecuzione<\/strong>, anche quelli che si verificano solo nei casi pi\u00f9 rari. Ecco perch\u00e9 in alcuni casi pu\u00f2 aiutarci a scovare problemi che attraverso i test a run time non avremmo mai trovato!<\/p>\n<p>Naturalmente dobbiamo tenere sempre bene a mente che anche se Clang Static Analyzer non rileva nulla, non vuol dire che non ci siano errori. Per questo, oltre all&#8217;analizzatore statico dobbiamo usare tutte le possibiliti tecniche complementari: dai test automatici agli strumenti per l&#8217;analisi a run time.<\/p>\n<p>Per quanto riguarda i falsi positivi, invece, una volta che avremmo accertato che sono davvero tali, possiamo selettivamente escuderli inserendoli in un blocco #ifndef:<\/p>\n<p>#ifndef __clang_analyzer__ \/\/ Code not to be analyzed #endif<\/p>\n<p>Per concludere aggiungiamo che Clang Static Analyzer supporta molte &#8220;annotazioni&#8221; sotto forma di attributi e pragma che possono aiutarlo a rendere le sue analisi pi\u00f9 accurate. Per maggiori informazioni rimandiamo alla <a href=\"http:\/\/clang-analyzer.llvm.org\/annotations\" target=\"_blank\">documentazione ufficiale<\/a>.<\/p>\n<h4>L&#8217;autore<\/h4>\n<p>Valerio Dutto. Ingegnere informatico con oltre 5 anni di esperienza nella realizzazione di software professionali. Dal 2009 si occupa a tempo pieno di sviluppo su piattaforme iOS e Mac OS X. Ha contribuito a oltre 15 applicazioni iPhone e iPad, alcune delle quali hanno ricevuto importanti riconoscimenti. Il suo sito Web \u00e8 <a href=\"http:\/\/www.valeriodutto.com\" target=\"_blank\">http:\/\/www.valeriodutto.com<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alcuni anni fa, durante la tesi universitaria, mi ero occupato di analisi statica, un argomento che mi&#8230;<\/p>\n","protected":false},"author":544,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7],"tags":[747,710,696,697,242,698,695],"class_list":["post-6958","post","type-post","status-publish","format-standard","hentry","category-strumenti-di-sviluppo","tag-analizzatore-statico-xcode-4","tag-debug-applicazioni-iphone","tag-strumenti-di-sviluppo-apple","tag-sviluppatori-iphone","tag-tutorial-xcode","tag-valerio-dutto","tag-xcode-4"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/544"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6958"}],"version-history":[{"count":8,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6958\/revisions"}],"predecessor-version":[{"id":6975,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6958\/revisions\/6975"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6958"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6958"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}