ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MISRA C 2012] 정적 분석 팁 ( 계속 업데이트 )
    Software/C 2024. 8. 29. 14:18
    728x90
    Overrun / Underrun 가능  (CWE)

    왼쪽 값(변수)에 맞춰 형변환으로 해결

     

     

     

    Norereturn (MISRA 2012)

    함수 마지막에 return; 추가로 해결

     

     

     

    반환형이 있는 함수 사용후 대입이나 사용이 안됨 (MISRA)

    함수를 if문으로 감싸고 bullean 비교 수행 후 ( != 0 : MISRA 룰 if 조건문 내부는 Bollean으로 비교해야함) 빈중괄호 추가로 해결

     

     

     

       미사용 변수 (MISRA)

    if문 넣어서 중괄호 추가로 해결

     

     

     

    반환타입이 void가 아닌 함수는 사용해야함. (ex : memset)

    함수 리턴을 void형변환으로 해결 ex : (void)memset(src , dest);

     

     

     

     if문의 then 또는 else가 복합문이 아님 (MISRA)

    if문 내부를 중괄호로 묶어 해결

     

     

     

    일반 산술변환 피 연산자가 다름  // 비교 연산자의 자료형이 다름 ( unsigned / int ) (MISRA)

    보통 상수 대입 시 생기는 룰셋.  unsigned 자료형이면 상수에 u를 붙여 대입 혹은 비교. float이면 .f를 붙여 대입 혹은 비교

     

     

     

    복합문의 결과가 연산 대리자(왼쪽) 과 자료형이 다름 (MISRA)

     int A = float f x int T  일때, 오른쪽은 float형태가 나오므로 생기는 오류. 두 구문으로 나눠 계산해서 해결

    float tmp = float f x int T;
    int A = (int)tmp;

     

     

     

    for문 조건식에 , 사용 불가  / Iterator에 조건 식과 상관없는 변수 대입 금지 ( MISRA )

     

    ex) 다음과 같은 for문 사용 불가

    for ( int i = 0; (num == 1u) && (int < sizeof(msg)) ; i++ , num++){}

     

    다음과 같이 수정 =>

    for ( int i = 0; (num == 1u) && (int < sizeof(msg)) ; i++ , num++){}  
    
    => for ( int i = 0; int < sizeof(msg) ;  i++ )
    {
        if ( num != 1u){ break; }
    
     ...
    
        num ++;
    }

     

     

     

     

     

     

    변수 xx의 정의 이전에 선언이 존재하지 않음

    header파일이 있다면 헤더파일에 해당 변수 추가 후 변수 사용 범위에 따라 extern or static 키워드 추가해서 선언.
    초기화를 선언과 동시에 하면 정의로 간주되므로 선언만 해야함. 비슷한 이유로 초기화와 선언을 동시에 같은 이름의 변수로 하면 중복 선언으로 컴파일 에러. 양 쪽이 전역변수 이고 한 쪽만 초기화와 선언을 진행하면 다른 한쪽은 자동적으로 컴파일러가 extern을 추가시켜서 컴파일하므로 오류가 발생하지 않음. 

    MISRA룰에 따라 무조건 static 혹은 extern을 선언해 사용하는 것이 좋음.

     

     

     

     

     

    null 포인터 상수가 매크로 NULL 또는 (void*)0으로 사용되지 않음

    상수 0을 NULL 매크로로 변경 후 해결

     

     

     

     

    728x90

    'Software > C' 카테고리의 다른 글

    [Keyword] __interrupt  (0) 2024.08.21
    전처리기 #if , #ifndef , #define, #endif  (0) 2024.08.20
    [Keyword] extern , static  (0) 2024.08.20