Макросы на C/C++ могут улучшить удобочитаемость и поддерживаемость кода. Макрос является именованным фрагментом кода, заданного с #define
директива, например:
#define MAXSIZE 64
MAXSIZE
, это заменяется 64 во время предварительной обработки.Polyspace обеспечивает несколько удобств для рассматривания результатов в линиях, содержащих макросы.
Если строка исходного кода содержит макрос, панель Source отображает линию со значком слева. Можно кликнуть по значку, чтобы расширить макрос, то есть, смотрите макроопределение и щелкните еще раз, чтобы свернуть макрос. Смотрите также:
Bug Finder:
Code Prover:
Исходный код в пользовательском интерфейсе рабочего стола Polyspace (Polyspace Code Prover)
Исходный код в Polyspace доступ к веб-интерфейсу (Polyspace Code Prover)
Если макрорасширение содержит несколько проверок на этапе выполнения Code Prover, линия со свернутым макросом имеет тот же цвет как худшая проверка на этапе выполнения. См. также Результат Code Prover и Цвета Исходного кода (Polyspace Code Prover).
Подобный функции макрос является макросом, который берет параметры, например:
#define max(x,y) x>y?x:y
Например:
В этом примере, определении макро-LEFTOVER()
содержит строчный l
и нарушает MISRA C:2012 Rule 7.3
. Этот результат показывают на макроопределении.
#define LEFTOVER(size) 10000ul - size /* Noncompliant */ #define REMAINDER(size) 10000UL - size /* Compliant */ void func(int arrSize) { int n = LEFTOVER(arrSize); int m = REMAINDER(arrSize); }
В этом примере, определении макро-COPY_ELEMENT()
результаты в неоднозначной оценке заказывают, и нарушает MISRA C:2012 Rule 13.2
только, когда параметр i++
передается ему. Этот результат показывают на макрорасширении, в частности на параметре в расширении.
int a[10], b[10]; #define COPY_ELEMENT(index) (a[(index)]=b[(index)]) void main () { int i=0, k=0; COPY_ELEMENT (k); /* Compliant */ COPY_ELEMENT (i++); /* Noncompliant */ }
Этот способ показать результаты в подобных функции макросах позволяет вам легко зафиксировать их:
Для проблем, вызванных макроопределением, можно реализовать фиксацию однажды. Инструменты, которые сообщают относительно макрорасширения, могут показать множественные нарушения для одной первопричины.
В предыдущем примере можно изменить строчный l
в LEFTOVER()
устранить проблему. REMAINDER()
макрос показывает эту фиксацию.
Для проблем, вызванных макро-параметрами, можно также реализовать фиксацию однажды.
В предыдущем примере можно вычислить i++
на отдельном шаге, и затем передают i
к COPY_ELEMENT()
макрос, чтобы устранить проблему.