Pregunta

Estoy trabajando en una pequeña investigación académica sobre el largas y complicadas funciones extremadamente en el núcleo de Linux . Estoy tratando de averiguar si hay una buena razón para escribir funciones 600 o 800 líneas de largo.

Para ello, me gustaría encontrar una herramienta que puede extraer una función de un archivo .c, por lo que se puede hacer algunas pruebas automatizadas en la función.

Por ejemplo, si tengo la función cifs_parse_mount_options() dentro del connect.c archivo, estoy buscando una solución que trabajar más o menos así:

extract /fs/cifs/connect.c cifs_parse_mount_options

y devolver las 523 líneas de código (!) De la función, a partir de la apertura de los apoyos a los tirantes de cierre.

Por supuesto, cualquier forma de manipular los paquetes de software existentes como gcc de hacer eso, sería más útil también.

Gracias,

Udi

Editar Las respuestas a para sacar las declaraciones de prototipo de función C? me convencieron de que la adecuación de declaración de la función por la expresión regular está lejos de ser trivial.

¿Fue útil?

Solución

¿Por qué no escribe un pequeño / PHP script en Perl / Python o incluso un pequeño C ++, Java o C # programa que hace eso?

No sé de ninguna herramienta ya hechas a hacer eso, pero escribir el código para analizar el archivo de texto y extraer un cuerpo de la función de un archivo de código C ++ no deben tomar más de 20 líneas de código .. El único difícil parte será localizar el comienzo de la función y que debe ser una tarea relativamente sencilla usando expresiones regulares. Después de eso, todo lo que necesita es para recorrer el resto del archivo de hacer el seguimiento de apertura y cierre de llaves y al llegar a la llave de cierre cuerpo de la función ya está.

Otros consejos

guión código -kr -o code.out

awk -f split.awk code.out

tiene que adaptar un poco wich poco split.awk es algo específico de mi código y refactorización necesidades (por ejemplo, y así han struct que no son typedefs

Y estoy seguro de que puede hacer una escritura más agradable: -)

--
BEGIN   { line=0; FS="";
    out=ARGV[ARGC-1]  ".out";
    var=ARGV[ARGC-1]  ".var";
    ext=ARGV[ARGC-1]  ".ext";
    def=ARGV[ARGC-1]  ".def";
    inc=ARGV[ARGC-1]  ".inc";
    typ=ARGV[ARGC-1]  ".typ";
    system ( rm " " -f " " out " " var " " ext " " def " " inc " " typ );
    }
/^[     ]*\/\/.*/   { print "comment :" $0 "\n"; print $0 >> out ; next ;}
/^#define.*/        { print "define :" $0 ; print $0 >>def ; next;}
/^#include.*/       { print "define :" $0 ; print $0 >>inc ; next;}
/^typedef.*{$/      { print "typedef var :" $0 "\n"; decl="typedef";print $0 >> typ;infile="typ";next;}
/^extern.*$/        { print "extern :" $0 "\n"; print $0 >> ext;infile="ext";next;}
/^[^    }].*{$/     { print "init var :" $0 "\n";decl="var";print $0 >> var; infile="vars";
                print $0;
                fout=gensub("^([^    \\*])*[    ]*([a-zA-A0-9_]*)\\[.*","\\2","g") ".vars";
                     print "var decl : " $0 "in file " fout;
                     print $0 >fout;
                next;
                        }
/^[^    }].*)$/     { print "func  :" $0 "\n";decl="func"; infile="func";
                print $0;
                fout=gensub("^.*[    \\*]([a-zA-A0-9_]*)[   ]*\\(.*","\\1","g") ".func";
                     print "function : " $0 "in file " fout;
                     print $0 >fout;
                next;
            }
/^}[    ]*$/        { print "end of " decl ":" $0 "\n"; 
                if(infile=="typ") {
                    print $0 >> typ;
                }else if (infile=="ext"){
                    print $0 >> ext;
                }else if (infile=="var") {
                    print $0 >> var;
                }else if ((infile=="func")||(infile=="vars")) {
                    print $0 >> fout; 
                    fflush (fout);
                    close (fout);
                }else if (infile=="def") {
                    print $0 >> def;
                }else if (infile=="inc"){
                    print $0 >> inc;
                }else print $0 >> out;
                next;
            }
/^[a-zA-Z_]/        { print "extern :" $0 "\n"; print $0 >> var;infile="var";next;}
            { print "other :" $0 "\n" ; 
                if(infile=="typ") {
                    print $0 >> typ;
                }else if (infile=="ext"){
                    print $0 >> ext;
                }else if (infile=="var") {
                    print $0 >> var;
                }else if ((infile=="func")||(infile=="vars")){
                    print $0 >> fout;
                }else if (infile=="def") {
                    print $0 >> def;
                }else if (infile=="inc"){
                    print $0 >> inc;
                }else print $0 >> out;
               next;
               }

en caso de que se están encontrando difícil de extraer los nombres de función:

1> Uso ctags (un programa) para extraer nombres de función.   ctags -x-C-fp = tipo vía_al_archivo. 2> una vez que te tienen los nombres de función, escribir un script sencillo en Perl para extraer contenido de función pasando el nombre del script de la función como se ha dicho anteriormente.

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