Я делаю приложение безопасным для приложений. Одним из шагов является синхронизация доступа или исключение использования глобальных переменных. Я использую Visual Studio. Я не могу найти хороший способ найти все глобальные переменные в моей кодовой базе. Невозможно создать хороший текстовый шаблон поиска, и я не могу найти полезный инструмент. Вы, ребята, знаете хороший способ сделать это? Это может быть инструмент анализа исходного кода или анализатор двоичных файлов.
Как найти все глобальные переменные в исходном коде С++, DLL или любом файле, созданном компилятором VС++?
Ответ 1
Это может помочь:
- Откройте проект в визуальной студии.
- Откройте "Класс" проекта
- Под заголовком проекта вы найдете "Глобальные функции и переменную".
Я проверил это с помощью Visual Studio 2010 и выше.
Изменить: Как было предложено Ajay в комментариях, вы также можете классифицировать элементы в группах. Для группировки элементов:
- В представлении класса щелкните правой кнопкой мыши название проекта
- Выберите "Group By Object/Member Type"
- Выберите требуемое дерево как переменные или структуры или перечисления и т.д.
Ответ 2
Один из вариантов может позволить компоновщику сгенерировать файл карты (/MAP в Visual Studio).
Вы получите файл .map для каждого двоичного файла с двумя разделами:
Таблица сегментов
Start Length Name Class
0001:00000000 00010000H .textbss DATA
0002:00000000 000034b4H .text CODE
0003:00000000 00000104H .CRT$XCA DATA
0003:00000104 00000104H .CRT$XCAA DATA
0003:00000208 00000104H .CRT$XCZ DATA
0003:0000030c 00000104H .CRT$XIA DATA
...
Список символов (функций и данных)
Address Publics by Value Rva+Base Lib:Object
0000:00000000 ___safe_se_handler_count 00000000 <absolute>
0000:00000000 ___safe_se_handler_table 00000000 <absolute>
0000:00000000 ___ImageBase 00400000 <linker-defined>
0001:00000000 __enc$textbss$begin 00401000 <linker-defined>
0001:00010000 __enc$textbss$end 00411000 <linker-defined>
0002:000003a0 _wmain 004113a0 f console4.obj
...
Вы можете отличить функции от переменных по коду "CODE" / "DATA" в списке сегментов.
Преимущество: вы получите все символы, даже те из библиотек, которые не были удалены компоновщиком.
Disadvanatge: вы получите все символы, даже те из библиотек, которые не были удалены компоновщиком. Я не знаю какого-либо инструмента, который автоматически выполняет разделение кода/данных.
Ответ 3
Я знаю программу http://code.google.com/p/data-race-test/wiki/ThreadSanitizer (продукт google), которая может работать в Windows и на скомпилированном коде. Это программа динамического инструментария (например, valgrind или bit like qemu/virtualbox), которые добавляют некоторые проверки доступа к памяти. Он попытается найти некоторые проблемы с потоками. Вы можете просто запустить свою программу под управлением threadanitizer. Там будет замедление от динамического перевода и от кода инструментария (до 20x-50x раз медленнее). Но некоторые проблемы будут обнаружены автоматически.
Он также позволяет вам аннотировать некоторые пользовательские функции синхронизации в исходном коде.
Wiki программы имеет ссылки на другие детекторы потока: http://code.google.com/p/data-race-test/wiki/RaceDetectionLinks
Ответ 4
Может быть, инструмент dumpbin
поможет здесь. Вы можете запустить его с помощью клавиши /SYMBOLS
для отображения таблицы символов COFF и поиска внешних символов. Глобальные переменные должны быть в этом списке. DUMPBIN/SYMBOLS.
Ответ 5
Cppclean - это инструмент статического анализа, который может вам помочь. Из документации:
cppclean finds global/static data that are potential problems when using threads.
Ниже приведен простой пример со статической локальной переменной и глобальной переменной.
./example.h:
void foo();
./example.cpp:
#include "example.h"
int globalVar = 42;
void foo(){
static int localStatic = 0;
localStatic++;
}
Откройте терминал и запустите cppclean следующим образом:
$ cppclean --include-path . example.cpp
example.cpp:3: static data 'globalVar'
example.cpp:6: static data 'localStatic'
К сожалению, у cppclean есть некоторые проблемы с синтаксическим анализом и ошибки. Однако эти проблемы встречаются довольно редко и затрагивают менее процента всего кода, который я тестировал.
Ответ 6
Вы можете попробовать CppDepend, используя его язык запросов кода
from f in Fields where f.IsGlobal select f