次のコードでは、clang API を使用して C コードを解析してから、
1) コードに HTML ヘッダーとフッターを追加して、ブラウザーで表示できるようにします。
2) IF ステートメントの THEN 部分の行番号を取得して出力します。
(2)で困っています。私は出力を理解することができません。次の入力 (行番号が追加されています) については、(関連する) 出力を次のように取得しています。
行番号は 6
行番号は 6
行番号は 6
行番号は 6
行番号は 12 です
行番号は 12 です
行番号は 12 です
行番号は 12 です
それぞれ 4 と 8 になると思います。誰かが私が間違っている場所を説明できますか?
私の入力は次のとおりです(行番号を削除するか、http://pastebin.com/hF5yMMAzにアクセスしてください)
%nl myinput.c
1 #include <stdio.h> 2 int func (int abc, int xyz) { 3 if (abc-1) 4 { 5 printf ("1\n"); 6 } 7 if (abc-2) 8 { 9 printf ("2\n");
10 }
11
12 リターン 0;
13 }
私のコードは次の場所にあります (1 つのファイルのみ) http://pastebin.com/txF9Bwa4
コードをコンパイルするには、次のコマンドを実行します。
CLANG_INSTALL=/usr/installdir/
g++ -I$CLANG_INSTALL/include/ -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -g -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fno-common -Woverloaded-virtual -Wcast-qual -fno-rtti -c -o rewritersample.o rewritersample.cpp
g++ -g -I$CLANG_INSTALL/include/ -o rewritersample rewritersample.o -lclangTooling -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangAnalysis -lclangARCMigrate -lclangRewriteFrontend -lclangRewriteCore -lclangEdit -lclangAST -lclangLex -lclangBasic -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMHexagonCodeGen -lLLVMHexagonAsmPrinter - lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMMBlazeDisassembler -lLLVMMBlazeCodeGen -lLLVMMBlazeDesc -lLLVMMBlazeAsmPrinter -lLLVMMBlazeAsmParser -lLLVMMBlazeInfo -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo-lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMSparcCodeGen -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCDisassembler -lLLVMMCParser -lLLVMInstrumentation -lLLVMInterpreter -lLLVMipo -lLLVMVectorize -lLLVMLinker -lLLVMBitWriter -lLLVMMCJIT -lLLVMJIT -lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts-lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMExecutionEngine -lLLVMTarget -lLLVMMC -lLLVMObject -lLLVMCore -lLLVMSupport -L$CLANG_INSTALL/lib/ -lz -lpthread -lm -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMTarget -lLLVMCore -VMlMMC -lLLVSupport ldl
コードを実行するには、コマンドは
$./rewritersample ./myinput.c