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

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

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

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

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

Выберите красный или оранжевый Invalid shift operations проверки. Получите следующую информацию из панели Result Details:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Если на панели Result Details отображается номер линии вероятной причины проверки, щелкните правой кнопкой мыши на панели Source. Выберите Go To Line.

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

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

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

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

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

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

    ПеременнаяКак найти предыдущие образцы переменной

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

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

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

      1. Щелкните правой кнопкой мыши переменную. Выберите Search For All References.

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

      2. На панели Search выберите предыдущие образцы.

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

      1. Дважды кликните переменную на панели Source.

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

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

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

    Щелкните правой кнопкой мыши переменную. Если появляется Show In Variable Access View опция, переменная является глобальной переменной.

    1. Выберите Show In Variable Access View опции.

      На панели Variable Access отображается текущий образец переменной.

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

      Операции записи переменной обозначаются и считываются с.

    Функция возврата значение

    ret=func();

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

      Щелкните правой кнопкой мыши func на панели Source. Выберите Go To Definition, если опция существует. Если определение недоступно для Polyspace, выбор опции приводит вас к объявлению функции.

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

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

Шаг 3: Проверьте общие причины проверки

Проверьте общие причины проверки Invalid Shift Operations.

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

    Для определения количества разрешенных бит:

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

      Щелкните правой кнопкой мыши переменную и выберите Go To Definition, если опция существует.

    2. Количество бит, допустимое для данного типа.

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

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

Шаг 4: Проверка трассировки на допущение Polyspace

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

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

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

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

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

Для получения дополнительной информации смотрите Допущения анализа Code Prover.