Переопределение unsigned Char Boolean_type на структуру True и False

Согласно Autosar_SWS логическое значение должно быть unsigned char. Но в моих композициях много нарушений MISRA, таких как правило MISRA 10.1 (нарушение преобразования), правило 12.6 (эффективное логическое значение).

Я хотел бы знать, переопределяю ли я BOOLEAN для своего приложения, как показано ниже:

#ifdefine BOOLEAN_T
#undefine BOOLEAN_T

typedef struct {
                 unsigned char TRUE  : 1;
                 unsigned char FALSE : 1;
               } BOOLEAN_T;    

#define TRUE 1;
#define False 0;

#endif

Каковы будут проблемы безопасности и последствия?


person user3285192    schedule 07.02.2014    source источник
comment
Какова цель определения BOOLEAN_T как структуры, а не как беззнакового символа?   -  person Markku K.    schedule 07.02.2014
comment
Ну его функциональное программное обеспечение безопасности. Я хотел бы ограничить логическое значение 0,1 .. не 0 и ненулевым. и избегайте любых нарушений мисры   -  person user3285192    schedule 07.02.2014


Ответы (3)


Для безопасности вы можете использовать, например, битовый шаблон:

unsigned char data = 0x55 << (input_bit & 1);

switch (data):/* instead of if() */
 case 0xaa:
  /*true*/
  break;
 case 0x55:
  /*false*/
  break;
 case default:
  /*exception*/
  break;
}
person nopsoft    schedule 07.02.2014
comment
Гораздо разумнее было бы использовать код с исправлением ошибок для защиты значения данных от случайного переключения битов. en.wikipedia.org/wiki/Error-correcting_code - person markgz; 07.02.2014
comment
Обычно это так, но если у вас нет аппаратного ECC, программный ECC/CRC эффективен (скорость кода) для блоков данных, а не для одной переменной. - person nopsoft; 07.02.2014
comment
спасибо .. мой вопрос не придерживаться 1 бита. но более строгий к 0 и 1 #ifdefine BOOLEAN_T #undefine BOOLEAN_T typedef struct { unsigned char TRUE ; беззнаковый символ FALSE ; } BOOLEAN_T; #define ИСТИНА 1; #define Ложь 0; #endif - person user3285192; 07.02.2014
comment
@nopsoft: ECC можно легко реализовать в программном обеспечении. Код ECC может быть определен для защиты значения B битов любого размера от N ошибок для любых значений B и N. - person markgz; 07.02.2014
comment
Это возможно, но давайте заметим накладные расходы кода для одной переменной. Это зависит от вашего приложения. FEC обычно реализуется аппаратно (например, DVBT). - person nopsoft; 07.02.2014
comment
В любом случае спасибо, ребята, за быстрые ответы!! . Было слишком много различных способов определения логического типа в обычном использовании, и не было общепринятого единого определения. Даже MISRA-2004 не имеет четкого определения. - person user3285192; 08.02.2014

Если вы используете 2-битную структуру для представления однобитовой величины, случайное изменение бита имеет 50% шанс изменить значение true/false на значение, которое не является ни истинным, ни ложным.

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

person markgz    schedule 07.02.2014
comment
Однократное случайное изменение бита имеет 100% шанс изменить действительное содержимое ни на истинное, ни на ложное. Обнаружение одного битфлипа таким образом можно было бы считать фичей... Но если запускать что-то подобное, ECC был бы еще полезнее. - person Yunnosch; 12.01.2018

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

Я бы посоветовал вам оставить определение логического значения разработчикам платформы AUTOSAR (типы платформ) и сосредоточиться на использовании логического значения в качестве unsigned char.

person DarkKnight    schedule 05.03.2014