Нарезка кода C с помощью Frama-c

Я хочу нарезать неиспользуемые переменные, которые отображаются с frama-c. Но я понятия не имею, какую командную строку я должен написать, чтобы разделить все неиспользуемые переменные одной командной строкой

Last login: Thu Nov  9 20:48:42 on ttys000
Recep-MacBook-Pro:~ recepinanir$ cd desktop
Recep-MacBook-Pro:desktop recepinanir$ cat hw.c
#include <stdio.h>

int main()
{
    int x= 10;
    int y= 24;
    int z;

  printf("Hello World\n");

  return 0;
}

Recep-MacBook-Pro:desktop recepinanir$ clang hw.c
Recep-MacBook-Pro:desktop recepinanir$ ./a.out
Hello World
Recep-MacBook-Pro:desktop recepinanir$ clang -Wall hw.c -o result
hw.c:5:9: warning: unused variable 'x' [-Wunused-variable]
    int x= 10;
        ^
hw.c:6:9: warning: unused variable 'y' [-Wunused-variable]
    int y= 24;
        ^
hw.c:7:9: warning: unused variable 'z' [-Wunused-variable]
    int z;
        ^
3 warnings generated.
Recep-MacBook-Pro:desktop recepinanir$ 

1 ответ

Как упоминалось на https://frama-c.com/slicing.html, нарезка всегда является относительным некоторым критерием, и цель состоит в том, чтобы создать программу, меньшую по сравнению с исходной, и демонстрирующую то же поведение по отношению к критерию., Сам плагин Slicing предоставляет несколько способов построения таких критериев, но, похоже, вы заинтересованы в результате использования плагина Sparecode ( https://frama-c.com/sparecode.html): это специализированная версия нарезка, где критерием является состояние программы в конце точки входа вашего анализа (т.е. main в твоем случае). Другими словами, Sparecode удалит все, что не влияет на конечный результат анализируемого кода. В твоем случае, frama-c -sparecode-analysis hw.c дает следующий результат (обратите внимание, что вызов printf был изменен плагином Variadic, и его аргумент не считается полезным для конечного состояния main. Если это проблема, вам нужно предоставить более специализированные выходные функции со спецификацией ACSL, указывающей, что они влияют на некоторую глобальную переменную)

/* Generated by Frama-C */
#include "stdio.h"
/*@ assigns \result, __fc_stdout->__fc_FILE_data;
    assigns \result
      \from (indirect: __fc_stdout->__fc_FILE_id),
             __fc_stdout->__fc_FILE_data;
    assigns __fc_stdout->__fc_FILE_data
      \from (indirect: __fc_stdout->__fc_FILE_id),
            __fc_stdout->__fc_FILE_data;
 */
int printf_va_1(void);

int main(void)
{
  int __retres;
  printf_va_1();
 __retres = 0;
 return __retres;
}

Наконец, обратите внимание, что в общем случае Slicing (следовательно, Sparecode) дает избыточную приближение: он удалит только те операторы, для которых он уверен, что они не влияют на критерий.

Другие вопросы по тегам