Макросы на C/C++ могут улучшить удобочитаемость и поддерживаемость кода. Макрос является именованным фрагментом кода, заданного с #define
директива, например:
#define MAXSIZE 64
MAXSIZE
, это заменяется 64 во время предварительной обработки.Polyspace обеспечивает несколько удобств для рассматривания результатов в линиях, содержащих макросы.
Если строка исходного кода содержит макрос, панель Source отображает линию со значком слева. Можно кликнуть по значку, чтобы расширить макрос, то есть, смотрите макроопределение и щелкните еще раз, чтобы свернуть макрос. Смотрите также:
Bug Finder:
Code Prover:
Если макрорасширение содержит несколько проверок на этапе выполнения Code Prover, линия со свернутым макросом имеет тот же цвет как худшая проверка на этапе выполнения. См. также Результат 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()
макрос, чтобы устранить проблему.