10 Temmuz 2018 Salı

MISRA C

Sürümler
MISRA'nın 1998/2004/2012 gibi sürümleri var. MISRA genellikle "emniyet kritik" gömülü tarzdaki uygulamalarda tercih ediliyor. Eğer MISRA kullanımı zorunlu değilse, CERT C terch edileblir. CERT C için açıklama şöyle
CERT C is specific guidance on writing "secure and resilient software in C and C++". The focus is on language specific advice on what to do and what not to do with what is a very powerful language that assumes you know what you are doing. Note that these languages are often used in writing low level code for infrastructure devices, or for embedded systems, so it is vital that they are well written.
MISRA 2008'den esinlenen AUTOSAR C++ da var.

MISRA Araçları DO-178 ile Kullanılabilir mi ?
Açıklaması şöyle. Eğer MISRA aracı DO-178 kalifikasyonuna sahip olduğunu söylemiyorsa kullanılamaz.
DO-178 tools need to be qualified for DO-178 if you are using them to test your software. I am not aware of anyone successfully using tools qualified for other standards (e.g. MISRA) in avionics

Bazı MISRA Kuralları

Array Bounds
Açıklaması şöyle
In MISRA-C:2012 there is the advisory rule 17.5 which requires that array parameters to functions should have bounds specified, to enable out-of-bounds checking of the array inside that function.
Typecasting a unsigned integer address to a pointer
Kural şunu yapmamamızı istiyor
reinterpret_cast<void*>(0x48036000U),
MISRA C 2012 rule 15.4 - "There should be no more than one break or goto statement used to terminate any iteration statement
Bir döngü içinde iki tane break olmamalı diyor. Bu kural aslında fikir olarak güzel ancak bazen uygulaması zor.
Örnek
Şu kod bu kuralı ihlal eder
do {
  retval = do_smth();
  if (retval != OK) {
    break;
  }

  retval = do_smth2();
  if (retval != OK) {
    break;
  }

  retval = do_smth3();
} while (0u);

Loop - Loop Üst Sınırında Side Effect
Örnek
Şu kod side effect'e sahip bir metod çağırıp döngünün üst sınırını belirlediği için için hata verir.
int foo (int *ptr)
{
  (*ptr)--;
  return *ptr;
}

void main()
{
  int a =20;
  int i;
  for (i=0; i< foo(&a) ; i++)
  {
    /*
      <loop body>
     */       
    }
}
Örnek
Şu kod döngünün üst sınırını belirlediği için için hata verir.
bool_t flag = false;
for ( int16_t i = 0; ( i < 5 ) && !flag; i++ )
{
  if ( C )
  {
    flag = true; /* Compliant - allows early termination of loop */
  }
  i = i + 3; /* Non-compliant - altering the loop counter */
}
If Elseif
Kural şöyle. Bu kural tamamen emniyet amaçlı.
if … else if constructs should be terminated with an else clause
Normalde kodlarken şöyle yaparız
if ( x < 0 )
{
   x = 0;
} /* else not needed */
Kural şöyle yapmamızı istiyor
if ( x < 0 )
{
    x = 0;
}
else if ( y < 0 )
{
    x = 3;
}
else    /* this else clause is required, even if the */
{       /* programmer expects this will never be reached */
        /* no change in value of x */
}






Hiç yorum yok:

Yorum Gönder