К сожалению, я даже не уверен, как называется этот вид статического анализа. Это не совсем анализ потока управления, потому что я не ищу вызовы функций, и мне не нужен анализ потока данных, потому что меня не волнуют фактические значения.
Мне просто нужен инструмент, который перечисляет места (файл, функция), где происходит доступ к записи определенной переменной. Меня даже не волнует, содержит ли этот список строки, которые недоступны. Я мог предположить, что написание простого парсера может быть достаточно для этой задачи, но я уверен, что должен быть инструмент, который выполняет этот простой анализ.
Будучи бедным студентом, я был бы признателен за бесплатные или лучшие инструменты с открытым исходным кодом, и если бы кто-то мог сказать мне, как на самом деле называется этот тип статического анализа, я был бы одинаково благодарен!
РЕДАКТИРОВАТЬ: я забыл упомянуть, что в базе кода нет арифметики указателей.
Почему бы вам не сделать переменную const
а затем запишите все ошибки, когда ваш компилятор запрещает доступ на запись?
Заметка: Это не будет отлавливать ошибки, когда память, лежащая в основе переменной, записывается каким-либо ошибочным способом, таким как переполнение буфера.
РЕДАКТИРОВАТЬ: Например:
const int a = 1;
a = 2;
a = 3;
Мой компилятор выдает:
1>MyProg.c(46): error C3892: 'a' : you cannot assign to a variable that is const
1>MyProg.c(47): error C3892: 'a' : you cannot assign to a variable that is const
Вы имеете в виду что-то подобное?
Это работает для программ на C, которые вы попытались проанализировать с помощью Анализ стоимости Frama-C. Это Open Source, и информация о зависимостях также доступна программно. Что касается статических анализаторов, то это скорее «точная» часть спектра. Это будет работать лучше, если ваша цель — встроенный C-код.
Я не уверен, что такой инструмент может быть написан. Указатели могут использоваться для изменения произвольных данных в памяти, не имея ссылок на другие переменные, указывающие на эти данные. Подумайте о таких функциях, как memset()
, которые меняют целые блоки памяти.
Если вас не интересуют такие мутации, вам все равно придется учитывать транзитивные указатели. В C вы можете иметь любое количество указателей, указывающих на одни и те же данные, и вам придется анализировать, где создаются копии этих указателей. И затем эти копии могут быть скопированы снова, …
Так что даже в «простом» случае это потребует довольно большого объема анализа кода.