4

私は、Linux カーネルの非常に長く複雑な機能に関する小規模な学術研究に取り組んでいます。600 行または 800 行の長さの関数を記述する正当な理由があるかどうかを把握しようとしています。

その目的のために、.c ファイルから関数を抽出できるツールを見つけて、関数に対していくつかの自動テストを実行できるようにしたいと考えています。

たとえばcifs_parse_mount_options()、 file 内に関数がある場合connect.c、おおよそ次のように機能するソリューションを探しています。

extract /fs/cifs/connect.c cifs_parse_mount_options

関数の 523 行のコード (!) を左中括弧から右中括弧まで返します。

もちろん、それgccを行うのが好きな既存のソフトウェアパッケージを操作する方法も、最も役に立ちます。

ありがとう、

ウディ

EDIT:C関数プロトタイプ宣言を引き出すための正規表現への答えは?正規表現による関数宣言の一致は簡単ではないことを確信しました。

4

3 に答える 3

3

それを行う小さな PERL/PHP/Python スクリプトや、小さな C++、Java、または C# プログラムを作成してみませんか?

それを行うための既製のツールについては知りませんが、テキスト ファイルを解析して C++ コード ファイルから関数本体を抽出するコードを作成するのに、20 行以上のコードは必要ありません関数の先頭を見つける必要があり、これは RegEx を使用した比較的単純なタスクである必要があります。その後、中かっこの開始と終了を追跡しながらファイルの残りの部分を反復処理するだけで、関数本体の終了中かっこに到達したら完了です。

于 2009-07-17T15:42:05.020 に答える
1

インデント-krcode-o code.out

awk -f split.awk code.out

あなたは少しsplit.awkを適応させる必要があります。これは私のコードとリファクタリングのニーズにいくらか固有です(たとえば、yはtypedefではない構造体を持っています

そして、私はあなたがより良いスクリプトを作ることができると確信しています:-)

--
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;
               }
于 2010-05-21T19:27:31.110 に答える