Форум программистов, компьютерный форум CyberForum.ru

нужно найти Глобальные Переменные в .срр файле - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
23.07.2013, 21:09     нужно найти Глобальные Переменные в .срр файле #1
у меня вот такая задача
Дано много .срр файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его глобальные переменные. Приветствуются отсылки к каким-нибудь утилитам, которые это умеют делать
парсер писать не реально
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 21:09     нужно найти Глобальные Переменные в .срр файле
Посмотрите здесь:

C++ Глобальные переменные
C++ Глобальные переменные
C++ глобальные переменные
Глобальные и статические глобальные переменные C++
Глобальные переменные C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.07.2013, 13:21     нужно найти Глобальные Переменные в .срр файле #21
castaway, Используя clang c++ api я так и не смог собрать представленный там код. При линковке всех нужных библиотек давало undefined ref к createDiagnostics, возможно у меня просто неправильно собран clang.

Добавлено через 1 час 38 минут
Меня хватило на вот это:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
 
#include <vector>
#include <iostream>
#include <memory>
#include <typeinfo>
#include <clang/Basic/Diagnostic.h>
#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/CompilerInvocation.h>
#include <clang/Frontend/Utils.h>
#include <clang/Frontend/ASTUnit.h>
int main()
{
   using namespace clang;
   using namespace llvm;
 
   std::unique_ptr<CompilerInstance> compiler(new CompilerInstance());
   compiler->createDiagnostics(0, nullptr);
   const char* args[] =
   {
      "-cc1",
      "test_file.cpp"
   };
   CompilerInvocation::CreateFromArgs
   (
      compiler->getInvocation(),
      args,
      args + 2,
      compiler->getDiagnostics()
   );
   std::unique_ptr<ASTUnit> unit
   (
      ASTUnit::LoadFromCompilerInvocation
      (
         &compiler->getInvocation(),
         IntrusiveRefCntPtr<DiagnosticsEngine>(&compiler->getDiagnostics()),
         false,
         true,
         false,
         TU_Complete,
         false
      )
   );
   if (unit)
   {
      std::cout << "Parsed succesfully" << std::endl;
   }
   else
   {
      std::cerr << "Parsing error" << std::endl;
      return 1;
   }
   ASTUnit::top_level_iterator decls_begin = unit->top_level_begin(), decls_end = unit->top_level_end();
   for (; decls_begin != decls_end; ++decls_begin)
   {
      Decl* decl = *decls_begin;
      VarDecl* var = dyn_cast<VarDecl>(decl);
      if (var)
      {
         if (var->isFileVarDecl())
         {
            std::cout << "global " << var->getNameAsString() << std::endl;
         }
      }
   }
}
Bash
1
cat test_file.cpp
C++
1
2
3
int value = 0;
struct {
} object;
Bash
1
2
3
4
./clang_parse 
Parsed succesfully
global value
global object
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 13:30     нужно найти Глобальные Переменные в .срр файле #22
А меня на такой.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
 
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
 
#include "clang/Basic/DiagnosticOptions.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
 
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/FileSystemOptions.h"
 
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/HeaderSearch.h"
#include "clang/Basic/FileManager.h"
 
#include "clang/Basic/TargetOptions.h"
#include "clang/Basic/TargetInfo.h"
 
#include "clang/Lex/Preprocessor.h"
#include "clang/Frontend/CompilerInstance.h"
 
int main()
{
    clang::DiagnosticOptions diagnosticOptions;
    clang::TextDiagnosticPrinter *pTextDiagnosticPrinter = new clang::TextDiagnosticPrinter( llvm::outs(), &diagnosticOptions );
 
    llvm::IntrusiveRefCntPtr <clang::DiagnosticIDs> pDiagIDs;
    clang::DiagnosticsEngine *pDiagnosticsEngine = new clang::DiagnosticsEngine( pDiagIDs, &diagnosticOptions, pTextDiagnosticPrinter );
 
    clang::FileSystemOptions fileSystemOptions;
    clang::FileManager fileManager( fileSystemOptions );
    clang::SourceManager sourceManager( *pDiagnosticsEngine, fileManager );
 
    clang::TargetOptions targetOptions;
    targetOptions.Triple = llvm::sys::getDefaultTargetTriple();
 
    clang::TargetInfo *pTargetInfo = clang::TargetInfo::CreateTargetInfo( *pDiagnosticsEngine, &targetOptions );
 
    llvm::IntrusiveRefCntPtr <clang::HeaderSearchOptions> hso;
 
    clang::LangOptions languageOptions;
    clang::HeaderSearch headerSearch( hso, fileManager, *pDiagnosticsEngine, languageOptions, pTargetInfo );
 
    llvm::IntrusiveRefCntPtr <clang::PreprocessorOptions> pOpts;
    clang::CompilerInstance compInst;
    clang::Preprocessor preprocessor( pOpts, *pDiagnosticsEngine, languageOptions, pTargetInfo, sourceManager, headerSearch, compInst );
 
    //const clang::FileEntry *pFile = fileManager.getFile( "test.c" );
    sourceManager.createMainFileID( fileManager.getFile( "test.c" ) /*pFile*/ );
    preprocessor.EnterMainSourceFile();
    pTextDiagnosticPrinter->BeginSourceFile( languageOptions, &preprocessor );
 
    clang::Token token;
    do {
        preprocessor.Lex( token );
        if ( pDiagnosticsEngine->hasErrorOccurred() ) break;
        preprocessor.DumpToken( token );
        std::cerr << std::endl;
    } while ( token.isNot( clang::tok::eof ) );
 
    pTextDiagnosticPrinter->EndSourceFile();
    return 0;
}
Кликните здесь для просмотра всего текста
test.c
C++
1
2
3
4
5
6
7
int g_a = 100;
 
int main()
{
    int l_a = 200;
    return 0;
}
Кликните здесь для просмотра всего текста
Вывод:
int 'int'
identifier 'g_a'
equal '='
numeric_constant '100'
semi ';'
int 'int'
identifier 'main'
l_paren '('
r_paren ')'
l_brace '{'
int 'int'
identifier 'l_a'
equal '='
numeric_constant '200'
semi ';'
return 'return'
numeric_constant '0'
semi ';'
r_brace '}'
eof ''
Только он просто парсит...
ForEveR, у тебя не 3.3 версия я так понимаю? У меня в 3.3 нет clang/Frontend/DiagnosticOptions.h
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.07.2013, 14:07     нужно найти Глобальные Переменные в .срр файле #23
castaway, 3.2 да. Твой код явно интереснее и чище.

Добавлено через 31 минуту
Вот код из туториалов по clang-api
https://github.com/loarabia/Clang-tu...Itutorial6.cpp
Ищет глобальные не extern переменные.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 14:25     нужно найти Глобальные Переменные в .срр файле #24
Кстати, код, который я привел, тоже оттуда. Я лишь внес незначительные изменения.
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 15:41  [ТС]     нужно найти Глобальные Переменные в .срр файле #25
ниужели не у кого нет рабочего кода?
castaway
24.07.2013, 15:59
  #26

Не по теме:

У кого-то точно есть. Главное верить, и повторять: исчезни боль, проблемы прочь, проблемы прочь.. И самое главное - это аутотренинг!

Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:01  [ТС]     нужно найти Глобальные Переменные в .срр файле #27
Цитата Сообщение от ForEveR Посмотреть сообщение
castaway, Используя clang c++ api я так и не смог собрать представленный там код. При линковке всех нужных библиотек давало undefined ref к createDiagnostics, возможно у меня просто неправильно собран clang.

Добавлено через 1 час 38 минут
Меня хватило на вот это:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
 
#include <vector>
#include <iostream>
#include <memory>
#include <typeinfo>
#include <clang/Basic/Diagnostic.h>
#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/CompilerInvocation.h>
#include <clang/Frontend/Utils.h>
#include <clang/Frontend/ASTUnit.h>
int main()
{
   using namespace clang;
   using namespace llvm;
 
   std::unique_ptr<CompilerInstance> compiler(new CompilerInstance());
   compiler->createDiagnostics(0, nullptr);
   const char* args[] =
   {
      "-cc1",
      "test_file.cpp"
   };
   CompilerInvocation::CreateFromArgs
   (
      compiler->getInvocation(),
      args,
      args + 2,
      compiler->getDiagnostics()
   );
   std::unique_ptr<ASTUnit> unit
   (
      ASTUnit::LoadFromCompilerInvocation
      (
         &compiler->getInvocation(),
         IntrusiveRefCntPtr<DiagnosticsEngine>(&compiler->getDiagnostics()),
         false,
         true,
         false,
         TU_Complete,
         false
      )
   );
   if (unit)
   {
      std::cout << "Parsed succesfully" << std::endl;
   }
   else
   {
      std::cerr << "Parsing error" << std::endl;
      return 1;
   }
   ASTUnit::top_level_iterator decls_begin = unit->top_level_begin(), decls_end = unit->top_level_end();
   for (; decls_begin != decls_end; ++decls_begin)
   {
      Decl* decl = *decls_begin;
      VarDecl* var = dyn_cast<VarDecl>(decl);
      if (var)
      {
         if (var->isFileVarDecl())
         {
            std::cout << "global " << var->getNameAsString() << std::endl;
         }
      }
   }
}
у меня пишет
Cannot open include file: 'clang/Basic/Diagnostic.h': No souch file or directory
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 17:03     нужно найти Глобальные Переменные в .срр файле #28
Hamlet, этот код для Clang версии 3.3
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:07  [ТС]     нужно найти Глобальные Переменные в .срр файле #29
а clang это компилятор, что ли?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.07.2013, 17:08     нужно найти Глобальные Переменные в .срр файле #30
Hamlet, Да. С добрым утром. Если вы серьезно думаете, что кто-то будет вам писать такую программу просто так + к тому даже не пытаетесь погуглить/попробовать узнать, что за варианты тут представлены, то вы сильно ошибаетесь.
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:14  [ТС]     нужно найти Глобальные Переменные в .срр файле #31
я уже 3-ий день сижу в гугле и никакого сересного ответа пока не нашел
попробовал
1. gccxml->xQuery ничего не получился
2. cpp->object->grep
3. clang
4. Source Insight
5. ctags
6. nm->UNIX, dumpbin с опцией /symbols для windows

никакого толка нету, я никогда раньше не сталкивался с такими проблемами и по этому не разбераюсь в этих варянтах
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.07.2013, 17:18     нужно найти Глобальные Переменные в .срр файле #32
Hamlet, С clang это сделать возможно. Но это нужно читать документацию и серьезно изучать clang api.
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:20  [ТС]     нужно найти Глобальные Переменные в .срр файле #33
а вот на это у меня не хватает время так как для решения задач у меня остался всего лишь 2 дня
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 17:22     нужно найти Глобальные Переменные в .срр файле #34
Hamlet, тогда настоятельно рекомендую обратиться в этот: http://www.cyberforum.ru/order-program/ раздел.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
24.07.2013, 17:42     нужно найти Глобальные Переменные в .срр файле #35
поиск глобальных переменных с++
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:46  [ТС]     нужно найти Глобальные Переменные в .срр файле #36
там тоже ничего серезного нет
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2013, 18:43     нужно найти Глобальные Переменные в .срр файле #37
Цитата Сообщение от Hamlet Посмотреть сообщение
есть много .cpp файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его Глобальные Переменные. Можно и даже нужно использование какого нибудь утилита, который это умеет делать
Можно натравить на исходники clang и использовать его AST.
Небольшой пример использования libclang.
А парсер плюсов (не их подмножество, а с практически полной поддержкой стандарта) написать за небольшое время невозможно - я на написание препроцессора для этого курса убил овер 300 часов (особенно много времени пожрало понимание и реализация макросов). Впрочем, я сомневаюсь, что вам понадобиться вся мощь плюсового препроцессора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2013, 22:28     нужно найти Глобальные Переменные в .срр файле
Еще ссылки по теме:

Глобальные переменные C++
Глобальные переменные C++
C++ Глобальные переменные

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 22:28     нужно найти Глобальные Переменные в .срр файле #38
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот код из туториалов по clang-api
https://github.com/loarabia/Clang-tu...Itutorial6.cpp
Ищет глобальные не extern переменные.
Совершенно верно. Компилируется это дело через MinGW используя Clang 3.3 и Makefile так:
Кликните здесь для просмотра всего текста
Makefile
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
APP = main
CFL = -pipe -c -Wall -std=c++11 -pedantic -Id:/dev/clang/include
LFL = -pipe -s -Ld:/dev/clang/lib
SRC = $(APP).cpp
OBJ = $(SRC:.cpp=.o)
LIB = -lclang -lclangSerialization \
      -lclangFrontend -lclangParse -lclangSema -lclangEdit -lclangSerialization -lclangDriver -lclangCodeGen -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers \
      -lclangStaticAnalyzerCore -lclangAnalysis -lclangRewriteCore -lclangRewriteFrontend -lclangAST -lclangLex -lclangBasic -lclangFormat -lLLVMSupport \
      -lLLVMJIT -lLLVMInterpreter -lLLVMAsmParser -lLLVMBitReader -lLLVMBitWriter -lLLVMCodeGen -lLLVMipo -lLLVMLinker -lLLVMSelectionDAG -lLLVMMCParser -lLLVMMC -ldbghelp
 
all: $(OBJ)
    g++ $(LFL) -o $(APP).exe $(OBJ) $(LIB)
 
%.o: %.cpp
    g++ $(CFL) $*.cpp -o $@
 
clean:
    @del $(OBJ)
    @del $(APP).exe
Обращаю внимание на то что библиотеки в Makefile подключаются именно в таком порядке.
Прикрепляю маленький EXE-шник (~ 10Mb) с примером.
Вложения
Тип файла: 7z 06_tut6.7z (2.59 Мб, 12 просмотров)
Yandex
Объявления
24.07.2013, 22:28     нужно найти Глобальные Переменные в .срр файле
Ответ Создать тему
Опции темы

Текущее время: 20:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru