Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

281
Vistas
¿Hay alguna manera de hacer una diferencia sintáctica/simántica del código C?

NEC2 se escribió originalmente en Fortran y ha habido dos puertos diferentes a C desde el Fortran original ( xnec2c y necpp ).

Los nombres de variables y funciones son similares (generalmente exactamente idénticos). Sin embargo, los autores eligieron estructuras de datos diferentes para los valores globales.

¿Hay alguna manera de diferenciar estas dos implementaciones para ver si hay diferencias reales , no solo diferencias en la convención de nomenclatura?

Parece que podría ser posible, las herramientas de refactorización como Coccinelle tienen cierta conciencia estructural y entienden los tipos de datos.

Si es así, los errores en un programa u otro causados por un error del autor pueden detectarse mediante dicho análisis estático. Luego, un ser humano podría comparar las implementaciones del código C con el Fortran original para ver cuál es la correcta, o si la representación sintácticamente diferente era computacionalmente equivalente. Tenga en cuenta que este es un análisis estático , solo queremos saber si la estructura del código (ramas y expresiones y, por lo tanto, tipos de datos) es la misma.

Por ejemplo, estas dos muestras calculan lo mismo pero el almacenamiento de las variables icon1 e ind1 difiere:

 if( -icon1[iprx] != jx ) ind1=2; else { xi= fabsl( cabj* cab[iprx]+ sabj* sab[iprx]+ salpj* salp[iprx]); if( (xi < 0.999999) || (fabsl(bi[iprx]/b-1.) > 1.e-6) ) ind1=2; else ind1=0; }

versus

 if( -data.icon1[iprx] != jx ) dataj.ind1=2; else { xi= fabs( dataj.cabj* data.cab[iprx]+ dataj.sabj* data.sab[iprx]+ dataj.salpj* data.salp[iprx]); if( (xi < 0.999999) || (fabs(data.bi[iprx]/dataj.b-1.0) > 1.0e-6) ) dataj.ind1=2; else dataj.ind1=0; } /* if( -data.icon1[iprx] != jx ) */
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esta tarea parece difícil de automatizar. Incluso un programador experimentado tendrá grandes dificultades y tendrá un dolor de cabeza terrible tratando de encontrar diferencias significativas en la semántica entre estos 2 cuerpos de código.

La diferencia obvia es el uso de fabs() frente a fabsl() , la versión long double . Pero debajo de la superficie, es necesario realizar un seguimiento de las definiciones de todas las variables y funciones utilizadas, lo que es más importante, los tipos de datos. Las variables tienen nombres idénticos, pero pueden definirse con tipos sutilmente diferentes, calculando resultados diferentes, a menudo muy parecidos, pero a veces muy diferentes.

Escribir un programa en C para realizar una comparación semántica de 2 archivos fuente, ignorando espacios y comentarios es factible, aunque no trivial. Manejar las diferencias en los nombres de las variables locales, los nombres de las funciones, los nombres de los miembros de la estructura y el diseño es mucho más difícil, pero probablemente factible. Manejar la refactorización, como reescribir bucles while en bucles for , convertir pruebas en expresiones ternarias, es más trabajo pero no imposible. Pero si los tipos cambian, se necesitaría un análisis exhaustivo de los rangos de valores y la precisión para garantizar la identidad semántica, lo que parece bastante difícil.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda