Подтвердить что ты не робот

Как найти все глобальные переменные в исходном коде С++, DLL или любом файле, созданном компилятором VС++?

Я делаю приложение безопасным для приложений. Одним из шагов является синхронизация доступа или исключение использования глобальных переменных. Я использую Visual Studio. Я не могу найти хороший способ найти все глобальные переменные в моей кодовой базе. Невозможно создать хороший текстовый шаблон поиска, и я не могу найти полезный инструмент. Вы, ребята, знаете хороший способ сделать это? Это может быть инструмент анализа исходного кода или анализатор двоичных файлов.

4b9b3361

Ответ 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

enter image description here