Невозможно напечатать правильные номера строк для части оператора if, Clang

В следующем коде я анализирую C-код, используя API Clang, а затем пытаюсь

1) Добавьте заголовок и нижний колонтитул HTML в код, чтобы его можно было просмотреть в браузере.

2) Получение номера строки THEN части оператора IF и его печать.

У меня проблемы в (2). Я не могу понять вывод. Для следующего ввода (с добавленными номерами строк) я получаю (соответствующий) вывод как

Номер строки 6

Номер строки 6

Номер строки 6

Номер строки 6


Номер строки 12

Номер строки 12

Номер строки 12

Номер строки 12


Я ожидаю, что это будет 4 и 8 соответственно. Может кто-нибудь объяснить, где я не прав?

Мой ввод выглядит следующим образом (удалите номера строк или перейдите на http://pastebin.com/hF5yMMAz)

%nl мой ввод.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 }

Мой код находится в следующем месте (только один файл): http://pastebin.com/txF9Bwa4

Чтобы скомпилировать код, выполните следующие команды:

CLANG_INSTALL=/usr/установочный каталог/

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 -lLLVMMipsAs mParser -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 -l LLVMCppBackendInfo -lLLVMTarget -lLLVMCore -lLLVMMC -lLLVMObject -lLLVMSupport -ldl

Чтобы запустить код, команда

$./rewritersample ./myinput.c


person user763410    schedule 10.07.2013    source источник


Ответы (1)


Здесь есть две проблемы:

  1. Вы вызываете getLocStart для IfStatement, а не для Then, поэтому вы получаете начальное местоположение токена if, а не { в теле if.
  2. nl по умолчанию присваивает номера только непустым строкам. В http://pastebin.com/hF5yMMAz ясно, что операторы if начинаются в строке 6 и строке 12. , а не в строках с номерами 3 и 7 в вашем вопросе. Используйте nl -ba, чтобы правильно пронумеровать строки.
person Richard Smith    schedule 10.07.2013