Вопрос по c – Как целочисленные типы преобразуются неявно?

5

Следующий код не проходит проверку MISRA. Конкретное сообщение об ошибке:

(MISRA-C:2004 10.1/R) The value of an expression of integer type shall not be implicitly converted to a different underlying type if it is not a conversion to a wider integer type of the same signedness

<code>typedef enum _MyEnum { One, Two } MyEnum;
MyEnum MyVariable;

int foo(void)
{
    int result = 1;

    if (One == MyVariable)  // fails here with MISRA-C:2004 10.1/R
    {
        result = 2;
    }    
    return result;
}
</code>
Why is the logical expression converted? What is converted here? Why does the code pass the MISRA check, when I swap One and MyVariable?

EditКомпилятор - это TI "MSP430 C / C ++ Compiler v4.0.0". с включенной проверкой правил MISRA.

К сожалению. Я только читаю код, так что кажется ;-) wildplasser
Я высказал предположение об ошибке компилятора Alex
Выдает ли это ту же ошибку / предупреждение дляif (MyVariable == One) {} ? wildplasser
@wildplasser Пожалуйста, прочитайте последнее предложение моего вопроса. harper
У меня уже есть плохие суждения об этой вещице MISRA. То, что вы делаете, прекрасно. cnicutar

Ваш Ответ

3   ответа
0

enums какunsigned integerДо тех пор, пока в пределахenum.

6

он ведет себя правильно. Вы получаете эту ошибку, потому что стандарт C ошибочен и нелогичен.

Есть два пункта:

One is an enumeration constant. The standard §6.7.2.2/2 states that this shall be compatible with int, no exceptions.

MyVariable is an enumerated type. The standard §6.7.7.2/4 states that this should be compatible with char, a signed integer type or an unsigned integer type. Which type that applies is implementation-defined behavior.

В вашем случае определяемый реализацией перечислимый тип кажется равным unsigned int.

Таким образом, код пытается косвенно преобразовать переменную со знаком int в unsigned int, что является нарушением MISRA 2004 10.1.

MISRA-совместимый код должен бытьif (One == (MyEnum)MyVariable).

@harper Да, стандарт C ISO 9899: 2011 (C90 идентичен). Ну, тогда своп должен быть ошибкой, он должен выдавать ошибку независимо от того, какой порядок вы используете.
& quot; Стандарт & quot; такое стандарт С? Если MyVariable - это неподписанное целое, почему проверка завершается успешно, когда я меняю One и MyVariable? harper
-1

Эта почта упоминает ошибку компилятора, приводящую к ошибкам Misra 10.1 / R при использовании компилятора TI.

Я знаю. Я только что упомянул это как пример проверки Misra, которая не удалась из-за ошибки компилятора.
Мы уже договорились об этом. Какова ваша точка зрения? @harper принял ответ, который, как я предполагаю, означает, что мои подозрения были верны.
Ошибка в ссылке относится к другой проблеме. Это та же проверка MISRA, которая не удалась, но она есть для ошибочной обработки элемента массива. Он не связан с порядком перечисления и переменной. harper
Это ошибка, подтвержденная TI. harper
Это не связано с проблемой вообще.

Похожие вопросы