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
MISRA Araçları DO-178 ile Kullanılabilir mi ?
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
Loop - Loop Üst Sınırında Side Effect
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);
Ö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.
Şu kod döngünün üst sınırını belirlediği için için hata verir.
Kural şöyle. Bu kural tamamen emniyet amaçlı.
Ş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 ElseifKural şöyle. Bu kural tamamen emniyet amaçlı.
Normalde kodlarken şöyle yaparızif … else if constructs should be terminated with an else clause
if ( x < 0 )
{
x = 0;
} /* else not needed */
Kural şöyle yapmamızı istiyorif ( 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