La extensión de la plataforma de pruebas de tareas para incluir el análisis de código (C / C ++)

StackOverflow https://stackoverflow.com/questions/3710532

Pregunta

Me estoy manteniendo / desarrollo de una plataforma para la prueba de la tarea. Es sobre todo automático. Lo que necesito ahora es añadir el análisis de código. Tengo que comprobar el código para construcciones específicas.

Por ejemplo:

¿El archivo contiene un main.cpp user clase llamada con un método const get_name()?

¿Hay alguna herramienta por ahí que me permita hacer tales cosas (ideal sería algo que puede ser un guión). Sólo Linux.

¿Fue útil?

Solución 4

He descubierto herramienta DESHIDRA de Mozilla. Parece ser escrito principalmente para fines internos, pero que sólo puede ser exactamente lo que estaba buscando.

https://developer.mozilla.org/En/Dehydra/Using_Dehydra

Editar: DESHIDRA es grande. Éste le falta algún menor de características como la determinación de los métodos const, pero por lo demás muy bien.

Otros consejos

Una posibilidad podría ser la de ejecutar el código a través de GCC y utilizar el extensión GCC-XML para producir descripciones XML de la estructura interna del programa. A continuación, puede utilizar su librería XML favorito para analizar el documento, o aplicar un XSLT para que si todo lo que necesita hacer es mostrarlo como HTML o lo que sea.

Probablemente se podría cortar juntos algo que utiliza la GCC-XML marco sin demasiado mucha dificultad.

¿Cómo se aplica esto a C? :)

¿El main.cpp archivo contiene un usuario llamado clase con un método get_name const ()?

Cree otro archivo (test.cpp) con

void test(void) {
  const user x;
  x.get_name();
}

test.cpp de compilación y main.cpp juntos. Si hay un error (código de salida! = 0), entonces NO , el archivo main.cpp no ??define una clase (público) llamado usuario con el método específico.

Advertencia: Se que hay C++, por lo excusa los errores importantes (o menores) en el anterior

.

Editar añadido de la escritura

#! /bin/sh

cat main.c test.c > 3710532.c
if gcc 3710532.c > /dev/null 2>&1
then echo OK
else echo BZZZT
fi
rm 3710532.c

No tengo instalado en esta máquina que estoy en un compilador C++ lista para su uso, por lo que mi prueba fue con un compilador y archivos C C. Mi compilador no lo hizo "trabajar con" gcc -combine main.c test.c por lo pellizqué esa parte.

La ejecución de este script con una combinación de trabajo de main.c y salidas test.c 'OK', de lo contrario se da salida a 'Bzzzt'.


Para las pruebas I utilizó este main.c

typedef int user;

int get_name(void) {
  return 0;
}

int main(void) {
  return 0;
}

y esto test.c

void test(void) {
  const user x;
  get_name();
}

muestra de ejecución

$ ./3710532.sh
OK

Si usted quiere hacer un análisis de código arbitrario, necesita arbitraria análisis / juego / etc. GCC-XML le dará información de la declaración, pero no el contenido de los métodos.

Nuestra software DMS Reingeniería Toolkit proporcionará la misma información abstracta como GCC -XML, pero adicionalmente incluir el detalle completo del contenido de las definiciones (por ejemplo, cuerpo de método información), con el apoyo de su C ++ frontales . Esto le permitirá acceder a delcarations y contenido para ver sus programas estudiantiles.

DMS proporciona propósito general de análisis de AST, tablas de símbolos y coincidencia de fuente-patrón. El extremo C ++ frontal proporciona completo C ++ análisis sintáctico, la construcción de AST C ++ y la información de símbolos correspondiente. Lo que se hace después de que el reconocimiento depende de usted, pero su ejemplo parece estar a punto en busca de un patrón específico.

La mitad de su ejemplo podría ser manejado por unos patrones de código DMS para C ++:

pattern is_correct_student_class(m:members):class =
  " class user { \m } ".

pattern is_correct_student_method_present(p:parameters,s:statements):method =
  " const  get_name(\p) { \s } "

(perdona mi sintaxis de C ++, no escribo mucho de ella), que coincidirá con cualquier AST, respectivamente, correspondientes a la clase usuario llamado y el método const deseado. Las citas son meta-citas, con lo que hay dentro de ser sintaxis de C ++ con escapes \ P, \ m y \ s representa los metavariables p, m, y s, que debe ser sintácticamente una lista de parámetros, una lista de métodos y listas de instrucciones, respectivamente, con el fin de que coincida con el patrón. Las definiciones de la lista de parámetros, etc. se derivan automáticamente desde la parte de la gramática C ++ de la C ++ Front End.

La otra mitad se implementa mediante un bit de código DMS PARLANSE ejecutado después de invocando el C ++ analizador y el nombre / tipo de resolución:

   (define has_student_code (lamdba (function boolean [tree AST]))
      (AST:IsInTree tree
          (lambda (function boolean [tree1 AST]
              (&& (Registry:MatchPattern tree1 "is_correct_student_class")
                  (AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
                       (lambda (function boolean [tree2 AST]) 
                           (Registry:MatchPattern tree2 ; a member
                                 "is_correct_student_method_present")
                       )lambda
          )lambda
      )
   )define

con algunas libertades tomadas para simplificar la presentación.

Este es un cheque bastante simple; se puede acceder a la tabla de símbolos del código PARLANSE hacer una comprobación más sofisticada si eso tiene sentido.

Mientras DMS no se ejecuta directamente en Linux, parece que se ejecute en el vino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top