Какой инструмент может перечислить доступ на запись к определенной переменной в C?

К сожалению, я даже не уверен, как называется этот вид статического анализа. Это не совсем анализ потока управления, потому что я не ищу вызовы функций, и мне не нужен анализ потока данных, потому что меня не волнуют фактические значения.

Мне просто нужен инструмент, который перечисляет места (файл, функция), где происходит доступ к записи определенной переменной. Меня даже не волнует, содержит ли этот список строки, которые недоступны. Я мог предположить, что написание простого парсера может быть достаточно для этой задачи, но я уверен, что должен быть инструмент, который выполняет этот простой анализ.

Будучи бедным студентом, я был бы признателен за бесплатные или лучшие инструменты с открытым исходным кодом, и если бы кто-то мог сказать мне, как на самом деле называется этот тип статического анализа, я был бы одинаково благодарен!

РЕДАКТИРОВАТЬ: я забыл упомянуть, что в базе кода нет арифметики указателей.

4

Решение

Почему бы вам не сделать переменную 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
4

Другие решения

Вы имеете в виду что-то подобное?

введите описание изображения здесь

Это работает для программ на C, которые вы попытались проанализировать с помощью Анализ стоимости Frama-C. Это Open Source, и информация о зависимостях также доступна программно. Что касается статических анализаторов, то это скорее «точная» часть спектра. Это будет работать лучше, если ваша цель — встроенный C-код.

1

Я не уверен, что такой инструмент может быть написан. Указатели могут использоваться для изменения произвольных данных в памяти, не имея ссылок на другие переменные, указывающие на эти данные. Подумайте о таких функциях, как memset(), которые меняют целые блоки памяти.

Если вас не интересуют такие мутации, вам все равно придется учитывать транзитивные указатели. В C вы можете иметь любое количество указателей, указывающих на одни и те же данные, и вам придется анализировать, где создаются копии этих указателей. И затем эти копии могут быть скопированы снова, …

Так что даже в «простом» случае это потребует довольно большого объема анализа кода.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector