Результаты Polyspace в линиях, содержащих макросы

Макросы на C/C++ могут улучшить удобочитаемость и поддерживаемость кода. Макрос является именованным фрагментом кода, заданного с #define директива, например:

#define MAXSIZE 64
Макро-имя действует как сокращение для фрагмента кода. Во время предварительной обработки каждый экземпляр макроса заменяется своим определением. Например, в вышеупомянутом примере, каждый раз вы используете MAXSIZE, это заменяется 64 во время предварительной обработки.

Polyspace обеспечивает несколько удобств для рассматривания результатов в линиях, содержащих макросы.

Макросы в исходных линиях могут быть расширены на месте

Если строка исходного кода содержит макрос, панель Source отображает линию соM icon значком слева. Можно кликнуть по значку, чтобы расширить макрос, то есть, смотрите макроопределение и щелкните еще раз, чтобы свернуть макрос. Смотрите также:

Результаты в Подобных Функции макросах, показанных только однажды

Подобный функции макрос является макросом, который берет параметры, например:

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