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

поиск глобальных переменных с++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 43, средняя оценка - 4.65
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
07.02.2012, 16:14     поиск глобальных переменных с++ #1
Есть задачка, которую не могу решить. Дано 9000 .cpp файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его глобальные переменные. Приветствуются отсылки к каким-нибудь тулзам, которые это умеют делать. Например, как это возможно вытянуть из линкера VS. Парсер написать пытаюсь, но это сложная задача для меня.

Добавлено через 12 минут
Помогите пожалуйста!очень нужно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.02.2012, 16:20     поиск глобальных переменных с++ #2
Парсер-то по идее не должен быть сложным. Нужно смотреть не в namespace-ли, не в функции-ли, не в структуре/классе/енуме/объединении.
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
07.02.2012, 16:33  [ТС]     поиск глобальных переменных с++ #3
парсер хорошо.
а как можно функцию распознать?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:43     поиск глобальных переменных с++ #4
ser_13, по блоку. { }. И по имени.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.02.2012, 16:45     поиск глобальных переменных с++ #5
На скорую руку как-то так.

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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
 
int value = 0;
 
void find_global_variables(const std::string& filename)
{
   std::vector<std::string> keywords = {"struct", "union", "namespace", "class", "enum"};
   std::ifstream ifs(filename);
   std::string s;
   std::stack<char> scopes;
   while (std::getline(ifs, s))
   {
      if (s.find("{") != std::string::npos)
      {
         scopes.push('{');
      }
      else if (s.find("}") != std::string::npos)
      {
         scopes.pop();
      }
      if (!scopes.empty())
      {
         continue;
      }
      bool is_global = true;
      for (std::vector<std::string>::iterator iter = keywords.begin(); iter != keywords.end(); ++iter)
      {
         size_t idx = s.find(*iter);
         if (idx != std::string::npos)
         {
            size_t end_idx = idx + iter->length();
            if (s[end_idx] != ' ')
            {
               continue;
            }
            else
            {
                is_global = false;
                break;
            }
         }
      }
      if (s.find(";") != std::string::npos && s.find("(") == std::string::npos && s.find("#") == std::string::npos
          && s.find("{") == std::string::npos && s.find("}") == std::string::npos)
      {
         if (is_global)
         {
            std::cout << "Global: " << s << std::endl;
         }
      }
   }
}
 
int main(int argc, char* argv[])
{
   for (int i = 1; i < argc; ++i)
   {
      std::cout << argv[i] << std::endl;
      find_global_variables(argv[i]);
   }
}
Код
forever@pterois:~/My_pro1/cpp_pro$ ./some some.cpp
some.cpp
Global: int value = 0;
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 16:45     поиск глобальных переменных с++ #6
Цитата Сообщение от soon Посмотреть сообщение
ser_13, по блоку. { }.
А если безымянное пространство имен?
Вроде такого
C++
1
2
3
4
5
6
int a = 1, b = 2;
{
   int temp = a;
   a = b;
   b = temp;
}
Хотя оно же вроде только в функциях применяться может.
Ну тогда можно вообще все, что не заключено в фигурные скобки считать глобальной переменной.
Тьфу, не безымянное пространство имен, а составной оператор.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.02.2012, 16:56     поиск глобальных переменных с++ #7
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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
 
int value = 0;
 
void find_global_variables(const std::string& filename)
{
   std::vector<std::string> keywords = {"struct", "union", "namespace", "class", "enum"};
   std::ifstream ifs(filename);
   std::string s;
   std::stack<char> scopes;
   while (std::getline(ifs, s))
   {
      if (s.find("{") != std::string::npos)
      {
         scopes.push('{');
      }
      else if (s.find("}") != std::string::npos)
      {
         scopes.pop();
      }
      if (!scopes.empty())
      {
         continue;
      }
      bool is_global = true;
      for (std::vector<std::string>::iterator iter = keywords.begin(); iter != keywords.end(); ++iter)
      {
         size_t idx = s.find(*iter);
         if (idx != std::string::npos)
         {
            size_t end_idx = idx + iter->length();
            if (s[end_idx] != ' ')
            {
               continue;
            }
            else
            {
                is_global = false;
                break;
            }
         }
      }
      std::string symbols = "()#{}";
      if (s.find(";") != std::string::npos && s.find_first_of(symbols) == std::string::npos)
      {
         if (is_global)
         {
            std::cout << "Global: " << s << std::endl;
         }
      }
   }
}
 
int main(int argc, char* argv[])
{
   for (int i = 1; i < argc; ++i)
   {
      std::cout << argv[i] << std::endl;
      find_global_variables(argv[i]);
   }
}
Код
forever@pterois:~/My_pro1/cpp_pro$ cat new.cpp
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
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
 
namespace
{
 
class Cl;
 
}
 
class Cl
{
};
 
template<class T>
class NS
{
   int value;
};
 
void function()
{
}
 
enum
{
   some,
   value
} enums;
 
struct s
{
};
 
namespace some
{
 
void foo()
{
}
 
}
 
union
{
} un;
Код
forever@pterois:~/My_pro1/cpp_pro$ ./some new.cpp 
new.cpp
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 16:58     поиск глобальных переменных с++ #8
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/4bce7c...e718a0f3693c3b
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 17:03     поиск глобальных переменных с++ #9
Цитата Сообщение от soon Посмотреть сообщение
diagon, а компилябельный вариант можно?
http://liveworkspace.org/code/4bce7c...e718a0f3693c3b
Ну да, в глобальной области такое не скомпилируется.(верхний пост я дополнил уже)
P.S.
а есть же еще такие штуки
C++
1
2
3
4
class C
{
   int a, b;
} variable;
По идее они тоже глобальными будут.
Felsurt
5 / 5 / 0
Регистрация: 06.02.2012
Сообщений: 19
07.02.2012, 17:57     поиск глобальных переменных с++ #10
это задание из яндекса на стажировку
можно писать парсер, а можно просто анализировать объектный файл
можно посмотреть соответствующие флажки компилятора, для составления карты объектного файла
а можно еще кучей других способов)
а вообще, если вы не можете сделать задание вступительное на стажировку, то вы уверены что эта работа для вас?
ser_13
1 / 1 / 0
Регистрация: 07.02.2012
Сообщений: 3
07.02.2012, 18:08  [ТС]     поиск глобальных переменных с++ #11
Спасибо Felsurt!
ваше сообщение мне придаст уверенности!

Добавлено через 14 секунд
Java
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package tectc;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class tect {
    int pint=0;
    tect(){}
    class strok{
        String str;
    }
 
    void start(){
         try {
            String poid="";
            BufferedWriter out;
            BufferedReader in;
            int s=0;
            
            out = new BufferedWriter(new FileWriter("D:\\runs\\rez.txt"));
            int l=0;
            next:
                
            for(l=0;l<=8577;l++){////8577
                if(l<10000)poid="D:\\runs\\00"+Integer.toString(l)+".cpp";
                if(l<1000)poid="D:\\runs\\000"+Integer.toString(l)+".cpp";
                if(l<100)poid="D:\\runs\\0000"+Integer.toString(l)+".cpp";
                if(l<10)poid="D:\\runs\\00000"+Integer.toString(l)+".cpp";
                File f1 = new File(poid);
                while((!f1.exists())&&(l<8577)){
                    continue next;
                    }
                in = new BufferedReader(new FileReader(poid));   
                System.out.println(poid);////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                out.write(poid);out.newLine();
                String str;
                //обработка строк------------------------------------------------------
                str=in.readLine();
                nextStr:
                while(str!=null){
                    if(str.length()==0){
                        str=in.readLine();
                        continue nextStr;
                        }
                     ////////
                    
                    String simvol;
                    for(int i=0;i<str.length();i++){
                        simvol=str.substring(i, i+1);
                        if(simvol.equals("/")){
                                i++;
                                if(i+1<str.length())
                                simvol=str.substring(i, i+1);
                              
                            if(simvol.equals("/")){
                                if(i!=1){
                                    str=str.substring(0, i-1);
                                    if(s==0){System.out.println(str);out.write(str);out.newLine();}//////!!!!!!!!!!!!!!!!!!!!!
                                    }
                                str=in.readLine();
                                continue nextStr;        
                            }
                            if(simvol.equals("*")){
                                int ind;
                                ind=str.indexOf("*/",i+1);
                                if(ind!=-1){
                                    str=str.substring(ind+2);
                                    continue nextStr;
                                }
                                str=in.readLine();
                                while(str!=null){
                                    ind=str.indexOf("*/");
                                    if(ind!=-1){
                                        str=str.substring(ind+2);
                                        continue nextStr;
                                    }
                                    str=in.readLine();
                                    continue nextStr;
                                }
                            }
                        }
                        if(simvol.equals("#")){
                            str=in.readLine();
                            continue nextStr;
                        }
                        if(simvol.equals("{")){
                            s++;
                            i++;
                            nextStr111:
                            while((s>0)&&(str!=null)){
                                if(str.length()==0){
                                    str=in.readLine();
                                    if(str==null){s--;continue next;}
                                    continue nextStr111;
                                    }
                                while(i<str.length()-1){
                                    simvol=str.substring(0, i+1);
                                    if(simvol.equals("{"))s++;
                                    if(simvol.equals("{"))s--;
                                    i++;
                                }
                                str=in.readLine();
                                if(str==null){s--;continue next;}
                                i=0;
                            }
                        }
                        //***************************************//
                       
                        
                         //***************************************/
                    }
                     ////////
                     if(s==0){System.out.println(str);out.write(str);out.newLine();}
                     str=in.readLine(); 
                 }
                //обработка строк------------------------------------------------------
               // 
            //System.gc();
            in.close();
            }//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            System.out.println(s);
            out.close();
        } catch (IOException e) {
       }  
        
    }
    public static void main(String[] arg) {
        tect ini = new tect();
        ini.start();
        
    }
    
}
 Комментарий модератора 
Используйте теги форматирования кода!


Добавлено через 1 минуту
код парсера!правда нужно немного доработать!

Добавлено через 1 минуту
код конечно не претендует на самый лучший, так сделано скорее на скорость!
и требует доработки!
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.02.2012, 18:09     поиск глобальных переменных с++ #12
Цитата Сообщение от soon Посмотреть сообщение
ser_13, по блоку. { }. И по имени.
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.02.2012, 18:12     поиск глобальных переменных с++ #13
Цитата Сообщение от diagon Посмотреть сообщение
По идее они тоже глобальными будут.
Так variable тоже за пределами {}.

taras atavin, вы о чём?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.02.2012, 18:14     поиск глобальных переменных с++ #14
О распознавании функций. А Вы о чём?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.02.2012, 18:15     поиск глобальных переменных с++ #15
taras atavin, и зачем распознавать функции? Задача - распознать глобальные переменные.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.02.2012, 18:16     поиск глобальных переменных с++ #16
Глобальные - это не локальные, а локальные - это которые в функциях. И хорошо, нашёл ты строку, начинающуюся с типа. А если это прототип функции? Поэтому ищем всё, что начинается с типов, потом проверяешь два признака: наличие () и нахождение в {} сразу после () без точки с запятой между ) и {. Если оба признака false, значит ты нашёл глобальную переменную.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.02.2012, 18:18     поиск глобальных переменных с++ #17
taras atavin, Ну так речь о том и шла. Надо смотреть все переменные, которые находятся вне блоков (будь то тело функции, класса или пространство имён). Так ответьте мне теперь на вопрос: при чем же всё-таки тут функции с их списком параметров?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.02.2012, 18:20     поиск глобальных переменных с++ #18
Эйси
C++
1
2
3
4
5
6
7
8
9
int f(int x); // По твоей логике это тоже глобальная переменная
int main ()
{
 return 0;
}
int f()
{
 return -x;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.02.2012, 18:21     поиск глобальных переменных с++ #19
На Java через регексы можно сделать. Просто повырезать все лишнее подобными запросами:
Java
1
str = str.replaceAll("template.*[{].*[}]", "");
А дальше уже несложно будет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2012, 18:23     поиск глобальных переменных с++
Еще ссылки по теме:

Объявление глобальных переменных в проекте Dev C++ C++
C++ Описание глобальных переменных
C++ Ошибка в сравнении глобальных переменных в функциях

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.02.2012, 18:23     поиск глобальных переменных с++ #20
Цитата Сообщение от taras atavin Посмотреть сообщение
Не по {}, а по (): мало ли, что там за блок, а функция имеет список параметров.
Под именем я подразумевал наличие (), если вы об этом.
Yandex
Объявления
07.02.2012, 18:23     поиск глобальных переменных с++
Ответ Создать тему
Опции темы

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