gccxml を試してみた。
C++の静的解析をやりたいなーって思っていたら、gccxmlというソフトがあるらしい。
debian なら apt-get で一発ではいるのでさくっと試してみた。
//インストール #apt-get install gccxml //テスト用のプログラム #vi test.c #include <stdio.h> int main() { printf("Hello World!"); return 0; } //ためしにコンパイルしてみる。 #gcc test.c //実行 #./a.out Hello World! //gccxmlでxml化してみる。 gccxml test.c -fxml=test.xml
できたxmlを超長いので抜粋
<Function id="_91" name="main" returns="_50" context="_1" location="f6:3" file="f6" line="3" endline="0"/>
あれ、、関数の宣言しか入っていない。。。
関数の中身がスルーされる。そういうものなのか?
関数の中身こそが解析したいとこなんだけどなぁ。。。
gcc なので、いろいろな言語に対応しているらしい。
と、いうわけで OpenCOBOL で試してみたw
OpenCOBOLはcobolを Cに変換して gccを通しているはず。。。
参考:OpenCOBOL マニュアル
http://www12.ocn.ne.jp/~peg/1_1.html
//OpenCOBOLのインストール。 #apt-get install open-cobol //サンプル 左に余白をあけるのがCOBOL流 vi hello.cob * Sample COBOL program IDENTIFICATION DIVISION. PROGRAM-ID. hello. PROCEDURE DIVISION. DISPLAY "Hello World!". STOP RUN. //コンパイル cobc -x hello.cob //実行 ./hello Hello World! //gccxmlにかけてみる。 動かん gccxml hello.cob hello.cob:1: error: expected constructor, destructor, or type conversion before 'COBOL' //コンパイラを指定してみる やっぱりダメ gccxml hello.cob --gccxml-compiler cobc /tmp/gccxml_identify_compiler20085.cc:1: Warning: Invalid indicator 'f' at column 7 /tmp/gccxml_identify_compiler20085.cc:4: Warning: Invalid indicator '_' at column 7 /tmp/gccxml_identify_compiler20085.cc:6: Warning: Invalid indicator '_' at column 7 /tmp/gccxml_identify_compiler20085.cc:8: Warning: Invalid indicator '_' at column 7 /tmp/gccxml_identify_compiler20085.pp: line 2: syntax error near unexpected token `__GNUC__' /tmp/gccxml_identify_compiler20085.pp: line 2: `fined(__GNUC__)' Error executing "/usr/share/gccxml-0.9/gccxml_find_flags cobc -g -O2 -g -Wall -O2 " Could not determine GCCXML_FLAGS setting. //オプションが悪いのか?と思って指定してみる gccxml hello.cob --gccxml-compiler cobc --gccxml-cxxflags "-x hello.cob" /tmp/gccxml_identify_compiler20123.cc:1: Warning: Invalid indicator 'f' at column 7 /tmp/gccxml_identify_compiler20123.cc:4: Warning: Invalid indicator '_' at column 7 /tmp/gccxml_identify_compiler20123.cc:6: Warning: Invalid indicator '_' at column 7 /tmp/gccxml_identify_compiler20123.cc:8: Warning: Invalid indicator '_' at column 7 /tmp/gccxml_identify_compiler20123.pp: line 3: IDENTIFICATIONDIVISION.: command not found /tmp/gccxml_identify_compiler20123.pp: line 4: PROGRAM-ID.hello.: command not found /tmp/gccxml_identify_compiler20123.pp: line 5: PROCEDUREDIVISION.: command not found /tmp/gccxml_identify_compiler20123.pp: line 6: DISPLAYHelloWorld!.: command not found /tmp/gccxml_identify_compiler20123.pp: line 7: STOPRUN.: command not found /tmp/gccxml_identify_compiler20123.pp: line 10: syntax error near unexpected token `__GNUC__' /tmp/gccxml_identify_compiler20123.pp: line 10: `fined(__GNUC__)' Error executing "/usr/share/gccxml-0.9/gccxml_find_flags cobc -x hello.cob" Could not determine GCCXML_FLAGS setting. //動かんのでデバッグしてみる。 //最終的にこのshellが動いてなんかやるらしい。中を見てみる。 vi /usr/share/gccxml-0.9/gccxml_find_flags -------抜粋-------- # Use the compiler's preprocessor to identify the compiler. GCCXML_PID="$$" cat > "/tmp/gccxml_identify_compiler$GCCXML_PID.cc" <<! #if defined(__GNUC__) GCCXML_SUPPORT="GCC" #elif defined(__sgi) && defined(_COMPILER_VERSION) GCCXML_SUPPORT="MIPSpro" #elif defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 700) GCCXML_SUPPORT="Intel" #elif defined(__SUNPRO_CC) GCCXML_SUPPORT="Sun" #else GCCXML_SUPPORT="" #endif ! # Run the compiler's preprocessor on the above code to identify it. # (workaround for CC whitespace:) if (${GCCXML_COMPILER} ${GCCXML_CXXFLAGS} \ -E "/tmp/gccxml_identify_compiler$GCCXML_PID.cc" \ | sed -e 's/[ ^]//g' \ > "/tmp/gccxml_identify_compiler$GCCXML_PID.pp"; rm -f "/tmp/gccxml_identify_compiler$GCCXML_PID.cc" ) ; then : ; else echo "Error running \"${GCCXML_COMPILER} -E\"" exit 1 fi -------抜粋--------
ようするに、コンパイラに食べさせる何かを作って、それを -E オプションで gcc とかのコンパイラに食べさせるらしい。
ただ、今回は、 ${GCCXML_COMPILER} の部分が OpenCOBOL の cobc になっているため、そんなの知らんといわれているみたい。
ただ、ためしにここを消してもエラーになって動作しない。
仮に動作させたとしても、関数本体が出力されるわけではないので、静的解析には使えないと思われる。
動作させる方法があったら誰か教えてください。
んなわけで、残念ですが (ノ`Д´)ノ彡┻━┻ することにしました。