Похоже, что ваша программа имеет неопределенное поведение, что предотвращает вызов критерия среза (PB_Main_event_send
), поэтому срез тривиально становится пустым.
Чтобы лучше это диагностировать, я рекомендую использоватьFrama-C GUI в этом случае. Просто замените frama-c
на frama-c-gui
в командной строке.
В зависимости от версии Frama-C вы начнете либо с проекта default
в графическом интерфейсе, либо с Slicing export
. Если последнее, просто перейдите в меню Project и нажмите default
-> Set current
, чтобы вернуться к начальному (не разрезанному) проекту.
Затем перейдите к функции PB_PacketProcess_IDLE_STATE
. Вы должны увидеть что-то похожее на это:
Это результат запуска Eva (анализа значений) в программе, что является одним из обязательных условий. анализ, вызываемый плагином Slicing. Красная часть - недоступный код. Это происходит именно при попытке доступа к buf[0]
, потому что buf
содержит скалярное значение без указателя, поэтому на него нельзя разыменовать. Тревога, излучаемая Евой незадолго до этого (mem_access: \valid_red(buf + 0)
), указывает на это.
Следовательно, Frama-C предполагает, что эта ветвь кода никогда не выполняется (никакие определенные поведения не позволяют это сделать), и нетдругие звонки на PB_Main_event_send
в коде. Таким образом, плагин Slicing справедливо заключает, что ваш критерий нарезки является тривиальным, и создает простейшую программу, которая эквивалентна поведению никогда не вызывать PB_Main_event_send
, которая является в основном пустой программой.
Это также объясняетВаше сообщение:
[from] Non-terminating function PB_PacketProcess_IDLE_STATE (no dependencies)
Для этой функции не определено завершающее поведение, поскольку выполнение всегда останавливается на неопределенном поведении. Это является основным показателем того, что что-то пошло не так, и поэтому вы не должны ожидать, что ваш фрагмент будет значимым.
Исправление кода (путем добавления некоторой фактической памяти, на которую указывает buf
, например, путем изменения ее объявления сОт int* msg
до int msg[10]
) получается срез, более похожий на то, что можно ожидать от этой программы.
Для более прямого ответа на ваш первый вопрос:
from
Плагин вычисляет зависимости между входами и выходами функций. Он неявно используется Slicing (как Eva). Его сообщение по умолчанию:
These dependencies hold at termination for the executions that terminate:
И затем отображает вычисленные зависимости.
Однако для функций без завершения таких зависимостей нет, поэтому он просто выдает «никаких зависимостей». "по умолчанию.
Для более прямого ответа на ваш второй вопрос:
Когда BLE_msgRxBuffer
является глобальной переменной, и вы включаете -lib-entry
его значение содержит не только указатель NULL
(в качестве инициализации по умолчанию для C), но также «репрезентативное местоположение» (см. раздел 6.3. Описание контекста анализа пользователя плагина Evaруководство ), на которое можно указать, несмотря на генерацию тревоги. Поэтому, когда вы достигнете точки программы, упомянутой выше, Eva все равно сгенерирует сигнал тревоги (из-за NULL
), но по крайней мере одно выполнение может продолжаться без неопределенного поведения. Поэтому вызов PB_Main_event_send
сохраняется, и нарезка напоминает то, что вы ожидали.