Макросы на 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() макрос, чтобы устранить проблему.