{"id":1119,"date":"2014-04-21T11:56:36","date_gmt":"2014-04-21T10:56:36","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1119"},"modified":"2014-04-25T11:18:03","modified_gmt":"2014-04-25T10:18:03","slug":"auditoria-aplicacion-legacy-c-microsoft-word-1-1a-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-2\/","title":{"rendered":"Auditor\u00eda de una aplicaci\u00f3n Legacy en C \u2013 Microsoft Word 1.1a (II)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1770\" alt=\"C_Analysis_Word2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word2.jpg\" width=\"266\" height=\"400\" \/><\/a>En el post anterior, hemos examinado los <a href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">primeros resultados del an\u00e1lisis de c\u00f3digo fuente de Word 1.1a <\/a>(1990).<\/p>\n<p>Contamos con 349 archivos, que no es enorme, pero con un tama\u00f1o alto: en promedio, m\u00e1s de 470 LOC (Lines Of Code), y muchos de ellos m\u00e1s all\u00e1 de 1 000 LOC. Las m\u00e9tricas de complejidad tambi\u00e9n son altas, y el nivel de comentarios bastante bajo, pero probablemente era normal hace m\u00e1s de 40 a\u00f1os.<\/p>\n<p>El muy bajo nivel de duplicaci\u00f3n hace pensar que todos los componentes necesarios para implementar una funcionalidad se encuentran en un mismo archivo, por lo que explica el tama\u00f1o y la complejidad de muchos de ellos. Parece que la consigna era: prioridad a la eficiencia, luego la legibilidad y la comprensi\u00f3n del c\u00f3digo en segundo plano. <!--more--><\/p>\n<p>\u00bfY ahora, que podemos ver del cumplimiento de las buenas pr\u00e1cticas de programaci\u00f3n? Lo examinamos en este segundo post.<\/p>\n<h2>Cumplimiento de las buenas pr\u00e1cticas<\/h2>\n<p>El &#8216;Treemap of Components&#8217; muestra un bajo nivel de cumplimiento de las buena pr\u00e1cticas de programaci\u00f3n.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Trremap.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1792\" alt=\"C_Word_Trremap\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Trremap.jpg\" width=\"581\" height=\"353\" \/><\/a><\/p>\n<p>Los archivos m\u00e1s numerosos y m\u00e1s complejos est\u00e1n en el directorio principal (&#8216;Opus&#8217;), y tienen entre el 20% y el 50% &#8216;Rules compliance&#8217; en la mayor\u00eda de los casos.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Trremap2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1793\" alt=\"C_Word_Trremap2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Trremap2.jpg\" width=\"581\" height=\"389\" \/><\/a><\/p>\n<p>En total, m\u00e1s de 40.000 &#8216;Issues&#8217;, la mayor\u00eda de tipo &#8216;Major&#8217; y una deuda t\u00e9cnica de m\u00e1s de 1 200 d\u00edas.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Issues.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1794\" alt=\"C_World_Issues\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Issues.jpg\" width=\"582\" height=\"121\" \/><\/a><\/p>\n<p>Ahora debemos examinar las normas infringidas por nivel de criticidad. Hay que recordarnos que he utilizado el Quality Profile predeterminado, &#8216;out of the box&#8217; como se dice en Ingl\u00e9s.<\/p>\n<h3>Blockers<\/h3>\n<p>No encontramos violaciones de reglas del tipo &#8216;Blocker&#8217;. Muy bien, es lo que deseamos ver en cualquier aplicaci\u00f3n. Pero \u00bfqu\u00e9 son estas reglas tan respetadas?<\/p>\n<h3><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Blockers.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1796\" alt=\"C_Word_Blockers\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Blockers.jpg\" width=\"843\" height=\"93\" \/><\/a><\/h3>\n<p>La primera es una buena pr\u00e1ctica para el manejo de excepciones en C++. As\u00ed que no es una sorpresa si se respeta completamente aqu\u00ed: no hay un solo &#8216;throw&#8217; en toda la aplicaci\u00f3n.<\/p>\n<p>La segunda se refiere al uso de Trigraphs, lo que no estoy seguro de que exist\u00edan en acuel tiempo. No soy un experto en lenguaje C, pero me parece que los &#8216;trigrafos&#8217; fueron introducidos por la norma C89, mucho despu\u00e9s de 1980. De todos modos, sabemos que no tenemos estos defectos.<\/p>\n<h3>Criticals<\/h3>\n<p>Hemos encontrado 753 defectos de tipo cr\u00edtico, la mayor\u00eda de ellos en dos reglas.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Crticals.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1797\" alt=\"C_World_Crticals\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_World_Crticals.jpg\" width=\"583\" height=\"207\" \/><\/a><\/p>\n<p>La primera se refiere al uso de &#8216;goto&#8217; para hacer un &#8216;jump&#8217;, es decir un salto para ir directamente a una zona distinta del c\u00f3digo. El &#8216;goto&#8217; se convirti\u00f3 en el s\u00edmbolo del c\u00f3digo &#8216;espagueti&#8217;, cuya l\u00f3gica algor\u00edtmica es dif\u00edcil de entender, debido al n\u00famero excesivo de referencias en todas las direcciones. No siempre es posible evitar los &#8216;goto&#8217;, pero es mejor disponer de ellos en el mismo bloque de c\u00f3digo, para facilitar la lectura, y por una mejor robustez tambi\u00e9n.<\/p>\n<p>Son los saltos a las porciones de c\u00f3digo imbricadas que son especialmente peligrosos. Un &#8216;goto&#8217; para un bloque de nivel superior es m\u00e1s f\u00e1cil de leer, excepto cuando el programa tiene m\u00e1s de 1 000 l\u00edneas y el salto te enviar\u00e1 un par de p\u00e1ginas m\u00e1s abajo. Dif\u00edcil de entender lo que hace el c\u00f3digo cuando pasas tu tiempo haciendo viajes entre varias p\u00e1ginas. Resulta extremadamente dif\u00edcil hacer un cambio sin introducir un error. Los costes de mantenimiento y de QA aumentan proporcionalmente.<\/p>\n<p>La segunda regla indica un uso de operadores l\u00f3gicos que presenta un riesgo de efectos secundarios debido a que conduce a cambiar un valor que no sea el c\u00f3digo de retorno, como una variable global, con consecuencias impredecibles en la ejecuci\u00f3n del programa.<br \/>\nTengamos en cuenta que las 335 ocurrencias encontradas en el c\u00f3digo no son necesariamente todas un defecto.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Misra5_14-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1798\" alt=\"C_Word_Misra5_14-1\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Misra5_14-1.jpg\" width=\"628\" height=\"92\" \/><\/a><\/p>\n<p>Por ejemplo, en este caso, si estamos seguros de que el &#8216;DocOpenStDof&#8217; no cambia ning\u00fan valor, sino que realiza una acci\u00f3n, como abrir un documento de Word, podemos signalar que no es un defecto, para que no se reconozca ya en los an\u00e1lisis futuros.<\/p>\n<p>La tercera regla es el uso de las constantes en octal, no muy f\u00e1ciles de leer, y que supone un riesgo de confusi\u00f3n con valores enteros. No se encuentran muchos, y si tenemos en cuenta que ciertas porciones de c\u00f3digo de MS-DOS se reutilizaron para escribir esta versi\u00f3n de Word, su presencia no es muy sorprendente.<\/p>\n<h3>Major<\/h3>\n<p>Las violaci\u00f3nes &#8216;Major&#8217; son las m\u00e1s numerosas, con diferencia. No voy a detallar a todas, pero unos breves comentarios sobre las m\u00e1s notables.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Majors1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1800\" alt=\"C_Word_Majors1\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Majors1.jpg\" width=\"818\" height=\"175\" \/><\/a><\/p>\n<p>La regla m\u00e1s transgredida (m\u00e1s de 9.000 violaci\u00f3nes) es el uso de &#8216;braces&#8217; en los tratamientos If-Else. De hecho, el examen del c\u00f3digo demuestra que no se utilizan cuando el If o el Else tiene muy pocas l\u00edneas, como un simple &#8216;return&#8217; o &#8216;goto&#8217;. As\u00ed que esta ausencia en realidad no es indicativo de una falta de legibilidad del c\u00f3digo, pues el esp\u00edritu de la norma general est\u00e1 respetado. El problema es que crea excepciones peligrosas, que adem\u00e1s he podido encontrar en el c\u00f3digo: con cuentas l\u00edneas sin estos signos podemos considerar que un tratamiento es menos comprensible?<\/p>\n<p>Probablemente desactivar\u00eda del Quality Profile la segunda regla para las reglas de nomenclatura, como suele ser muy a menudo el caso en &#8216;naming conventions&#8217;: que no se respetan no significa que no existen. Y usualmente, prefiero guardarlas en la categor\u00eda &#8216;Minor&#8217;.<\/p>\n<p>Las sintaxis de tipo K&amp;R (Kernighan y Richie) son obsoletas hoy en d\u00eda porque se consideran dif\u00edciles de leer, pero no lo eran a principios de los 80s.<\/p>\n<p>La mayor\u00eda de las dem\u00e1s violaci\u00f3nes de tipo &#8216;Major&#8217; tambi\u00e9n afectar\u00e1n a la legibilidad y comprensi\u00f3n del c\u00f3digo, como se muestra a continuaci\u00f3n.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Majors2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1802\" alt=\"C_Word_Majors2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Word_Majors2.jpg\" width=\"570\" height=\"652\" \/><\/a><\/p>\n<p>He configurado este widget para mostrar las reglas &#8216;Major&#8217; por n\u00famero de defectos. La gran mayor\u00eda son buenas pr\u00e1cticas de programaci\u00f3n que recomiendan evitar tratamientos demasiado largos, como &#8216;Switch cases should not have too many lines\u2019 o \u2018Function\/methods should not have too many lines\u2019, funciones complejas (\u2018Avoid too complex function\u2019 para las funciones con m\u00e1s de 20 puntos de Cyclomatic Complexity), reglas de nomenclatura (\u2018Literal suffixes shall be upper case\u2019), etc.<\/p>\n<p>En realidad son (relativamente) muy pocos los defectos &#8216;Major&#8217; que pueden afectar a la fiabilidad y robustez de la aplicaci\u00f3n.<\/p>\n<h3>Minor<\/h3>\n<p>Esto tambi\u00e9n es cierto para las reglas de tipo &#8216;Minor&#8217; que son, sin embargo, menos numerosas.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word_Minors.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1803\" alt=\"C_Analysis_Word_Minors\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word_Minors.jpg\" width=\"582\" height=\"241\" \/><\/a><\/p>\n<p>El an\u00e1lisis de los &#8216;Issues&#8217; encontrados en el c\u00f3digo de esta primera versi\u00f3n de Word confirma <a href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">nuestra evaluaci\u00f3n inicial<\/a>. todo parece indicar que las prioridades han sido centradas en la eficiencia y la fiabilidad, ya que las violaci\u00f3nes de este tipo son menos numerosas. Las infracciones a las buenas pr\u00e1cticas de mantenimiento y la capacidad de evoluci\u00f3n del c\u00f3digo representan la gran mayor\u00eda de los problemas encontrados, lo que explica una deuda t\u00e9cnica muy importante para una primera versi\u00f3n de esta aplicaci\u00f3n.<\/p>\n<p>Ciertamente hay algunas reglas, como las de &#8216;naming conventions&#8217; por ejemplo, que se pueden desactivar. Yo no quer\u00eda cambiar el Quality Profile predeterminado para el an\u00e1lisis del c\u00f3digo, pero seguramente se deber\u00eda adaptarlo a las caracter\u00edsticas de una aplicaci\u00f3n &#8216;Legacy&#8217; en C.<\/p>\n<p>Sin embargo, el pr\u00f3ximo post nos permitir\u00e1 ver algunos casos en los que es mejor comenzar nuestro proceso de evaluaci\u00f3n de esta manera.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el post anterior, hemos examinado los primeros resultados del an\u00e1lisis de c\u00f3digo fuente de Word 1.1a (1990). Contamos con 349 archivos, que no es enorme, pero con un tama\u00f1o alto: en promedio, m\u00e1s de 470 LOC (Lines Of Code), y muchos de ellos m\u00e1s all\u00e1 de 1 000 LOC. Las m\u00e9tricas de complejidad tambi\u00e9n [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1119","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1119"}],"collection":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/comments?post=1119"}],"version-history":[{"count":36,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1119\/revisions"}],"predecessor-version":[{"id":1156,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1119\/revisions\/1156"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1119"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}