Используя Frama-C, я пытаюсь нарезать только один исходный код следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct
{
int event;
int status;
int* msg;
}pbBLEEvt_t;
int msgq_receive(pbBLEEvt_t *buff);
void PB_Main_event_send(int, int, void*);
static int PB_ble_ps_state = 0;
static void PB_PacketProcess_IDLE_STATE(int *buf) {
int service_id = buf[0];
switch (service_id) {
case 5:
PB_Main_event_send(0, 0, ((void *)0));
break;
default:
break;
}
}
static void PB_IncomingPacketHandler(int *buf) {
switch (PB_ble_ps_state) {
case 3:
task_sleep(100);
break;
case 4:
PB_PacketProcess_IDLE_STATE(buf);
break;
default:
break;
}
}
void PB_ble_control_task(void * arg) {
int r;
pbBLEEvt_t BLE_msgRxBuffer;
for(;;) {
r = msgq_receive(&BLE_msgRxBuffer);
switch(BLE_msgRxBuffer.event) {
case 1 :
switch(BLE_msgRxBuffer.status) {
case 2 :
PB_IncomingPacketHandler(BLE_msgRxBuffer.msg);
break;
default:
break;
}
default:
break;
}
}
}
Команда среза следующая:
SOURCE="test.c"
MAIN="PB_ble_control_task"
CALLS="PB_Main_event_send"
OUTPUT="framac_output.c"
frama-c -c11 $SOURCE -lib-entry -main $MAIN -slice-calls $CALLS -slicing-level 2 \
-then-on 'Slicing export' -print -ocode $OUTPUT \
2>&1 | tee framac_msg
Я нашел следующее сообщение frama-c:
[from] Non-terminating function PB_PacketProcess_IDLE_STATE (no dependencies)
Когда я изменяю локальную переменную «BLE_msgRxBuffer» в функции PB_ble_control_task() на глобальную переменную, я получаю нарезанный код, который мне нужен.
- Что означает сообщение «нет зависимостей»?
- Почему я получил нужный мне нарезанный код после изменения локальной переменной «BLE_msgRxBuffer» в функции PB_ble_control_task() на глобальную переменную?
PB_ble_ps_state
всегда равно нулю, поэтомуPB_PacketProcess_IDLE_STATE
никогда не будет вызываться, а член пакета*msg
никогда не будет освобожден. - person Paul Ogilvie   schedule 24.10.2019