2016-02-25 3 views
1

Я использую QAC, и я получаю следующее сообщение для соответствующей строки исходного кода. Как я могу отдать его, чтобы QAC «понял» его?Как я могу выразить выражение, чтобы избавиться от предупреждения QAC?

Компилятор, используемый gcc - он не предупреждает об этой проблеме, так как он установлен на «iso c99».

#define DIAGMGR_SIGNED_2_BYTES_178   ((s16)178) 

sK = (s16)(sE1/DIAGMGR_SIGNED_2_BYTES_178); 
       ^

Результат знакового деления или остаток операций может быть определена реализация

.

Разделение («/») или остаточный («%») операция выполняется в подписанного целого типа, и результат может быть от реализации. Сообщения 3103 генерируются для целочисленного деления или остатка операции в знаковом типе, где:

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

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

  • Отдел будет круглым к нулю, и любой ненулевой остаток будет отрицательное значение
  • Разделение округлит от нуля, и любой ненулевой остаток будет положительное значение В ISO: Стандарт C99 первый подход - . В стандарте ISO: C90 может использоваться любой подход - результат определяется реализацией. Например:

/PRQA S 3120,3198,3408,3447 ++/

extern int r; 

extern int si; 

extern void foo(void) 
{ 
    r = -7/4;  /* Message 3103 *//* Result is -1 in C99 but may be -2 in C90 */ 

    r = -7 % 4;  /* Message 3103 *//* Result is -3 in C99 but may be 1 in C90 */ 
    si = si/r; /* Message 3103 */ 
} 

ответ

2

Вам нужно настроить инструмент так, что он понимает, что ваш код С99. В старом стандарте C90 разделение с отрицательными числами может быть реализовано двумя разными способами: see this. Это была известная «ошибка» в стандарте C90, которая была исправлена ​​с C99.

Это стандартное предупреждение для большинства инструментов статического анализа, особенно если они настроены на проверку соответствия MISRA-C. Оба MISRA-C: 2004 и 2012 требуют, чтобы программист знал об этой «стандартной ошибке» стандарта C.


обходные в C90:

Если вы знаете наверняка, что операнды не отрицательны, просто бросить их без знака типа, или использовать неподписанный тип, чтобы начать с.

Если вы знаете, что операнды может быть отрицательным:

  • Если один из операндов отрицателен, установите флажки, чтобы указать, какой из них (ей) это было.
  • Возьмите абсолютные значения обоих операндов.
  • Выполнение деления по абсолютным значениям.
  • Повторно добавить знак на цифры.

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

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

+0

Другой грязный трюк, который я бы не рекомендовал, может заключаться в том, чтобы инкапсулировать все подразделения внутри функций C99. Например, используя составной литерал: 'int result = (int [1]) {x/y} [0];'. Если инструмент дает предупреждение о небезопасном разделении на этой линии, было бы довольно сложно для поставщика инструмента объяснить объяснение, почему :) – Lundin

Смежные вопросы