exponenta event banner

Просмотр и исправление недействительных проверок операций смены

Выполните один или несколько из этих шагов до тех пор, пока не будет определено исправление для проверки недопустимых операций смены. Существует несколько способов исправления чека. Описание проверки и примеры кода см. в разделе Invalid shift operations.

Иногда, особенно для оранжевой проверки, можно определить, что проверка представляет собой не реальную ошибку, а предположение Polyspace ®, которое не соответствует вашему коду. Если для смягчения предположения можно использовать опцию анализа, повторно запустите проверку с помощью этой опции. В противном случае в результат или код можно добавить комментарий и обоснование.

Общий рабочий процесс, применяемый ко всем проверкам, см. в разделе Интерпретация результатов проверки кода в пользовательском интерфейсе Polyspace Desktop.

Шаг 1: Интерпретировать информацию о проверке

Установите красный или оранжевый флажок Недопустимые операции смены. Получите следующую информацию на панели Сведения о результате (Result Details).

  • Причина проверки - красный или оранжевый. Возможные причины:

    • Сумма смены может быть вне допустимых пределов.

      Программное обеспечение также указывает допустимый диапазон для величины смены.

    • Левый операнд левого сдвига может быть отрицательным.

    В приведенном ниже примере возникает красная ошибка, так как величина сдвига выходит за допустимые пределы. Допустимый диапазон для величины смены - от 0 до 31.

    Возможное исправление: Чтобы избежать красной или оранжевой проверки, выполняйте операцию смены только в том случае, если величина смены находится в пределах границ.

    if(shiftAmount < (sizeof(int) * 8))
      /* Perform the shift */
    else
      /* Error handling */

  • Вероятная причина проверки, если программное обеспечение предоставляет эту информацию.

    В предыдущем примере программное обеспечение идентифицирует упертую функцию, getVal в качестве вероятной причины.

    Возможное исправление: Чтобы избежать оранжевой проверки, ограничьте возвращаемое значение getVal. Например, укажите, что getVal возвращает значения в определенном диапазоне, например, 0..10. Дополнительные сведения см. в разделе Допущения о упорных функциях.

Шаг 2: Определение первопричины проверки

  • Если величина сдвига находится вне границ, отслеживайте поток данных для переменной сдвига. Определите подходящую точку, в которой можно ограничить переменную сдвига.

    В следующем примере выполните трассировку потока данных для shiftAmount.

    void func(int val) {
    	int shiftAmount = getShiftAmount();
    	int res = val >> shiftAmount;
    }
    Вы можете найти это getShiftAmount возвращает полный диапазон значений.

    Возможное исправление:

    • Выполнять смену только в том случае, если shiftAmount находится в диапазоне от 0 до (sizeof(int))*8 - 1.

    • Ограничение возвращаемого значения getShiftAmount, в теле getShiftAmount или через интерфейс спецификации ограничений Polyspace (Polyspace Constraint Specification), если у вас нет определения getShiftAmount. Дополнительные сведения см. в разделе Допущения о упорных функциях.

  • Если левый операнд операции левого сдвига может быть отрицательным, отслеживайте поток данных для переменной левого операнда. Определите подходящую точку, в которой можно ограничить переменную левого операнда.

    В следующем примере выполните трассировку потока данных для shiftAmount.

    void func(int shiftAmount) {
    	int val = getVal();
    	int res = val << shiftAmount;
    }
    Вы можете найти это getVal возвращает полный диапазон значений.

    Возможное исправление:

    • Выполнять смену только в том случае, если val является положительным.

    • Ограничение возвращаемого значения getVal, в теле getVal или через интерфейс спецификации ограничений Polyspace (Polyspace Constraint Specification), если у вас нет определения getVal. Дополнительные сведения см. в разделе Допущения о упорных функциях.

    • Если необходимо разрешить операцию в Polyspace, используйте опцию анализа Разрешить отрицательный операнд для левых смен. Посмотрите Allow negative operand for left shifts (-allow-negative-operand-in-shift).

Чтобы отследить поток данных, выберите проверку и запишите информацию на панели Сведения о результате (Result Details).

  • Если на панели Сведения о результате (Result Details) отображается последовательность инструкций, которые приводят к проверке, выберите каждую инструкцию.

  • Если на панели Сведения о результате (Result Details) отображается номер строки вероятной причины проверки, щелкните правой кнопкой мыши панель Источник (Source). Выберите «Перейти к строке».

  • В противном случае:

    1. Найдите предыдущую операцию записи для переменной, которую требуется отследить.

    2. При предыдущей операции записи определите новую переменную для обратной трассировки.

      Установите курсор на переменные, участвующие в операции записи, чтобы увидеть их значения. Значения помогают выбрать переменную для трассировки.

    3. Найдите предыдущую операцию записи для новой переменной. Таким образом можно продолжить трассировку до тех пор, пока не будет определена точка для задания ограничения.

    В зависимости от переменной используйте следующие сочетания клавиш навигации для поиска предыдущих экземпляров. В интерфейсе пользователя Polyspace можно выполнить только следующие действия.

    ПеременнаяПоиск предыдущих экземпляров переменной

    Локальная переменная

    Используйте один из следующих методов.

    • Поиск переменной.

      1. Щелкните правой кнопкой мыши переменную. Выберите Поиск всех привязок (Search For All References).

        Все экземпляры переменной отображаются на панели Поиск (Search) с выделенным текущим экземпляром.

      2. На панели Поиск (Search) выберите предыдущие экземпляры.

    • Просмотрите исходный код.

      1. Дважды щелкните переменную на панели «Источник».

        Все экземпляры переменной подсвечиваются.

      2. Прокрутите вверх, чтобы найти предыдущие экземпляры.

    Глобальная переменная

    Щелкните правой кнопкой мыши переменную. Если отображается опция Показать в представлении доступа к переменной, переменная является глобальной переменной.

    1. Выберите опцию Показать в представлении переменного доступа (Show In Variable Access View).

      На панели «Доступ к переменной» отображается текущий экземпляр переменной.

    2. На этой панели выберите предыдущие экземпляры переменной.

      Операции записи для переменной обозначаются с помощью, а операции чтения - с помощью.

    Возвращаемое значение функции

    ret=func();

    1. Найдите определение функции.

      Щелкните правой кнопкой мыши func на панели «Источник». Выберите «Перейти к определению», если опция существует. Если определение недоступно для Polyspace, выбор опции приводит к объявлению функции.

    2. В определении func, идентифицировать каждый return заявление. Переменная, возвращаемая функцией, является новой переменной для обратной трассировки.

    Можно также определить, связаны ли переменные в какой-либо операции с какой-либо предыдущей операцией. См. раздел Поиск связей между переменными в коде.

Шаг 3: Поиск общих причин проверки

Найдите общие причины проверки недопустимых операций смены.

  • Проверьте, указан ли нужный тип целевого процессора. Целевой тип процессора определяет количество битов, разрешенных для определенного типа переменной.

    Чтобы определить допустимое количество битов:

    1. Перейдите к определению переменной. Обратите внимание на тип переменной.

      Щелкните правой кнопкой мыши переменную и выберите «Перейти к определению», если опция существует.

    2. См. количество битов, разрешенных для данного типа.

      В конфигурации, используемой для результатов, выберите узел Target & Compiler. Нажмите кнопку Edit рядом со списком Target processor type.

  • Для левых смен с отрицательным операндом см., если вы намереваетесь выполнить правую смену.

Шаг 4: Проверка трассировки в соответствии с предположением Polyspace

Проверьте, можно ли отследить оранжевый чек по предположению Polyspace, которое встречается ранее в коде. Если предположение не соответствует действительности в вашем случае, добавьте комментарий или обоснование в результат или код. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.

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

  1. Polyspace предполагает, что функция может возвращать отрицательное значение.

  2. Операция сдвига влево может выполняться при отрицательном значении, и поэтому операция проверяется оранжевым цветом.

  3. Если известно, что функция возвращает положительное значение, добавьте комментарий и обоснование, описывающие, почему код не был изменен.

Дополнительные сведения см. в разделе Допущения анализа проверки кода.