exponenta event banner

Модуляция анализа полиспейса с помощью команды построения

Для настройки анализа Polyspace ® можно повторно использовать параметры компиляции в команде build, например: make. Сначала выполните трассировку команды build с помощью polyspace-configure (или polyspaceConfigure в MATLAB ®) и создайте файл параметров Polyspace. Позже этот файл опций будет задан для последующего анализа Polyspace.

Если команда build создает несколько двоичных файлов, по умолчанию polyspace-configure группирует исходные файлы для всех двоичных файлов в один файл параметров Polyspace. Если двоичные файлы, использующие одни и те же исходные файлы или функции, компилируются с различными параметрами, это различие будет потеряно в последующем анализе Polyspace. Наличие одной и той же функции несколько раз может привести к ошибкам связи во время анализа Polyspace и иногда к неправильным результатам.

В этом разделе показано, как создать отдельный файл параметров Polyspace для каждого двоичного файла, созданного в файле makefile. Предположим, что makefile создает четыре двоичных файла: два исполняемых (target cmd1 и cmd2) и две общие библиотеки (целевая liba и libb). Для каждого из этих двоичных файлов можно создать отдельный файл параметров Polyspace.

Чтобы попробовать этот пример, используйте файлы в polyspaceroot\help\toolbox\bugfinder\examples\multiple_modules. Здесь, polyspaceroot является папкой установки Polyspace, например, C:\Program Files\Polyspace\R2021a или C:\Program Files\Polyspace Server\R2021a.

Исходный код построения

Проверьте файл макияжа. Make-файл создает четыре двоичных файла:

CC := gcc
LD := ld

LIBA_SOURCES := $(wildcard src/liba/*.c)
LIBB_SOURCES := $(wildcard src/libb/*.c)
CMD1_SOURCES := $(wildcard src/cmd1/*.c)
CMD2_SOURCES := $(wildcard src/cmd2/*.c)
LIBA_OBJ := $(notdir $(LIBA_SOURCES:.c=.o))
LIBB_OBJ := $(notdir $(LIBB_SOURCES:.c=.o))
CMD1_OBJ := $(notdir $(CMD1_SOURCES:.c=.o))
CMD2_OBJ := $(notdir $(CMD2_SOURCES:.c=.o))
LIBB_SOBJ := libb.so
LIBA_SOBJ := liba.so

all: cmd1 cmd2

cmd1: liba libb
	$(CC) -o  $@ $(CMD1_SOURCES) $(LIBA_SOBJ) $(LIBB_SOBJ)

cmd2: libb
	$(CC) -c $(CMD2_SOURCES) 
	$(LD) -o $@ $(CMD2_OBJ) $(LIBB_SOBJ)

liba: libb
	$(CC) -fPIC -c $(LIBA_SOURCES)
	$(CC) -shared -o $(LIBA_SOBJ) $(LIBA_OBJ) 

libb: 
	$(CC) -fPIC -c $(LIBB_SOURCES)
	$(CC) -shared -o $(LIBB_SOBJ) $(LIBB_OBJ) 

.PHONY: clean
clean: 
	rm *.o


Созданные двоичные файлы имеют зависимости, показанные на этом рисунке. Например, создание объекта cmd1.o зависит от всех .c файлы в папке cmd1 и общие объекты liba.so и libb.so.

Создайте исходный код с помощью make-файла. Используйте -B флаг для обеспечения полного построения.

make -B

Убедитесь, что построение завершается.

Создание файла параметров одного пространства для полного построения

Трассировка команды build с помощью polyspace-configure. Использовать опцию -output-options-file создание файла параметров Polyspace psoptions из команды build.

polyspace-configure -output-options-file psoptions make -B

Запустите средство поиска ошибок или средство проверки кода, используя ранее созданный файл параметров. Сохраните результаты анализа в results подпапка.

polyspace-bug-finder -options-file psoptions -results-dir results

Вы видите эту ошибку ссылки (предупреждение в Bug Finder):

Procedure 'main' multiply defined.

Ошибка возникает из-за файлов cmd1/cmd1_main.c и cmd2/cmd2_main.c оба имеют main функция. При выполнении команды build эти два файла используются в отдельных конечных объектах make-файла. Однако polyspace-configure по умолчанию создает один файл параметров для полного построения. Файл параметров Polyspace содержит оба исходных файла, что приводит к конфликтующим определениям main функция.

Чтобы проверить причину ошибки, откройте файл параметров Polyspace psoptions. Вы видите эти строки, которые включают файлы с конфликтующими определениями main функция.

-sources src/cmd1/cmd1_main.c
-sources src/cmd2/cmd2_main.c

Создать файл параметров для конкретного двоичного файла в команде Build

Чтобы избежать ошибки связи, создайте исходный код для определенного двоичного файла при трассировке команды build с помощью polyspace-configure.

Например, создайте исходный код для двоичного файла cmd1.o. Укажите цель makefile cmd1 для make, который создает этот двоичный файл.

polyspace-configure -output-options-file psoptions make -B cmd1

Запустите средство поиска ошибок или средство проверки кода, используя ранее созданный файл параметров.

polyspace-bug-finder -options-file psoptions -results-dir results

Ошибка связи не возникает, и анализ завершается. Можно открыть файл параметров Polyspace psoptions и увидеть, что только исходные файлы в cmd1 вложенная папка и файлы, участвующие в создании общих объектов, включены в -sources вариант. Исходные файлы в cmd2 подпапка, которая не участвует в создании двоичного файла cmd1.o, не включены в файл параметров Polyspace.

Специальные рекомендации для библиотек (только для программы проверки кода)

При отслеживании создания общего объекта из библиотек извлекаемые исходные файлы не содержат main функция. В последующем анализе проверки кода можно увидеть ошибку из-за отсутствия main.

Использовать параметр «Полиспейс» Verify module or library (-main-generator)(Средство проверки кода Polyspace) для создания main функция. Укажите параметр в созданном файле параметров или непосредственно в командной строке. См. раздел Проверка приложения C без основной функции (средство проверки кода Polyspace).

В C++ используйте следующие дополнительные опции для классов:

Создать один файл параметров для двоичного файла, созданного в команде Build

Чтобы создать файл параметров для конкретного двоичного файла, созданного в команде build, необходимо знать сведения о команде build. Если вы не знакомы с внутренними деталями команды build, можно создать отдельный файл параметров Polyspace для каждого двоичного файла, созданного в команде build. Подход работает для двоичных файлов, которые являются исполняемыми файлами, общими (динамическими) библиотеками и статическими библиотеками.

Этот подход работает только при использовании следующих компиляторов:

  • GNU C или GNU C++

  • Microsoft Visual C++

Трассировка команды build с помощью polyspace-configure.Для создания отдельного файла параметров для каждого двоичного файла используйте опцию -module с polyspace-configure.

polyspace-configure -module -output-options-path optionsFilesFolder make -B

Команда создает файлы параметров в папке optionsFilesFolder. В предыдущем примере команда создает четыре файла параметров для четырех двоичных файлов:

  • cmd1.psopts

  • cmd2.psopts

  • liba_so.psopts

  • libb_so.psopts

Можно запустить Polyspace для реализации кода конкретного двоичного файла с помощью соответствующего файла опций. Например, можно запустить программу проверки кода для реализации кода двоичного файла, созданного из целевого файла makefile. cmd1 с помощью этой команды:

polyspace-bug-finder -options-file cmd1.psopts -results-dir results

Также можно выполнить циклический перебор всех файлов опций, созданных с помощью -module вариант polyspace-configure. Например, следующий сценарий Bash запускает Polyspace для всех созданных файлов опций, создавая отдельную папку результатов на основе имени файла опций.

#!/bin/bash
FILEPATHS=optionsFilesFolder/*.psopts
for filePath in $FILEPATHS
do
    echo "Running Polyspace on $filePath"
    fileName="${filePath##*/}"
    resultsDirName="${fileName%.*}_results"
    logName="${fileName%.*}.log"
    polyspace-bug-finder -options-file "$filePath" -results-dir "${resultsDirName}" >> "${logName}"
done

Для этого подхода не требуется знать сведения о команде build. Однако при создании отдельного файла параметров для каждого двоичного файла таким образом каждый файл параметров содержит исходные файлы, непосредственно задействованные в двоичном файле, а не через общие объекты. Например, файл параметров cmd1.psopts в этом примере указываются только исходные файлы в cmd1 подпапка, а не исходные файлы, участвующие в создании общих объектов liba.so и libb.so. Последующий анализ с использованием этого файла параметров не может получить доступ к функциям из общих объектов и использует вместо этого заглушки функций. При анализе программы проверки кода (Code Prover), если вы видите слишком много проверок оранжевого цвета из-за тупика, используйте подход, описанный в разделе Создание файла параметров для конкретного двоичного файла в команде Build.

Специальные рекомендации для библиотек (только для программы проверки кода)

При отслеживании создания общего объекта из библиотек извлекаемые исходные файлы не содержат main функция. В последующем анализе проверки кода можно увидеть ошибку из-за отсутствия main.

Использовать параметр «Полиспейс» Verify module or library (-main-generator)(Средство проверки кода Polyspace) для создания main функция. Укажите параметр в созданном файле параметров или непосредственно в командной строке. См. раздел Проверка приложения C без основной функции (средство проверки кода Polyspace).

В C++ используйте следующие дополнительные опции для классов:

См. также

|

Связанные темы