2012-05-14 4 views
0

먼저이 메시지는 How are integer types converted implicitly?과 유사하지만 MISRA 경고가 다릅니다.MISRA Violation Rule 10.1 및 Enums

컴파일러는 MISRA 오류를 생성하지 않지만 정적 분석 도구는 생성합니다. 진행중인 공구 제조업체의 티켓이 있습니다.

감안할 :

#include <stdio.h> 
enum Color {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE}; 

int main(void) 
{ 
    enum Color my_color; 
    my_color = BLUE; 
    if (my_color == YELLOW) // Generates MISRA violation, see below. 
    { 
    printf("Color is yellow.\n"); 
    } 
    else 
    { 
    printf("Color is not yellow.\n"); 
    } 
    return 0; 
} 

정적 분석 도구 if 진술하는 MISRA 위반이 발생된다

MISRA-2004 Rule 10.1 violation: implicitly changing the signedness of an expression. 
Converting "4", with underlying type "char" (8 bits, signed), 
to type "unsigned int" (32 bits, unsigned) with different signedness. 

컴파일러 정확하거나 정적 분석 도구 (결함을 식별하지 않음)?

+0

같은 코드, 동일한 오류, 오류 보고서는 조금 더 말 수가 많은. 코드 스 니펫간에 차이점은 없습니다. – Mat

+0

나는 당신이 당신의 툴 - 벤더로부터 어떤 답장을 받았는지에 대해 알고 싶지만 툴이 고장난 것처럼 보입니다. – Andrew

답변

4

표현식의 타입 :

typedef enum Colors {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE} Colors_t; 

signed int이다.

또한 언어에 따라 열거 된 항목의 값은 전체 열거 형을 포함 할 수있는 최소 단위입니다. 따라서 위의 열거 형에서는 BLUE의 형식이 signed char입니다.Colors_t의 변수가 BLUE 비교하면

정적 분석 도구는 MISRA 위반 신고 :

Colors_t my_color; 
if (my_color == BLUE) // This generates a MISRA violation. 

위반이 signed intsigned char에 비교됩니다. 또한

이 열거 항목이 열거 이후 는 고유 한 유형하지 않은, 오류없이 다른 열거 유형과 혼합 할 수 있습니다

typedef enum Tree_Species {REDWOOD, CYPRUS, PALM, OAK, JUNIPER, SEGUARO} Tree_Species_t; 
Tree_Species_t my_tree; 
my_tree = BLUE; 
0

누군가 (컴파일러 또는 정적 도구)가 귀하의 열거 형이 int과 같은 크기 및/또는 부호가 아니라고 생각합니다.

My Green Hills 컴파일러에는 위의 예에 대해 char 유형을 선택할 수있는 --short-enum (Enum에 대해 가장 작은 유형 가능) 옵션이 있습니다. 컴파일러에 이러한 옵션이 있습니까? 활성화되어 있습니까? 컴파일러의 기본 열거 형 값이 "비표준"값입니까?

내 경험에 의하면, 기본적으로 정적 도구는 기본적으로 언어 사양을 잘 따르기 때문에 int 크기의 enum을 사용해야합니다. 참조 용으로이 링크를 참조하십시오 : What is the size of an enum in C?. 대부분의 정적 도구가 컴파일러 명령 줄 사용을 스누핑하므로 컴파일 타임 옵션은 열거 형이 int보다 작음을 정적 분석기에 확신시킬 수 있습니다.

컴파일러 및 정적 분석기 설명서를 철저히 검토하여 충돌을 해결하는 것이 좋습니다. 빌드 프로세스를주의 깊게 관찰하십시오 (컴파일 타임 옵션, 기본값 등).

-1

그것은이에서 '열거'을 제거보십시오 my_color

enum Color my_color; 

의 선언의 결과로 가능성이 높습니다 :

Color my_color; 

정적 분석기는 아마 별도의 열거를 선언하는 것을 생각한다, 따라서 10.1 위반. 그 이후 다른 유형 인 MISRA 규칙은 한 유형을 다른 유형으로 할당하는 것을 금지합니다. C 언어 사양에 따라

+2

-1 어? 이것은 C++가 아니라 C입니다. 'enum Color {A, B, C}; 후에''Color'라고 정의 된 타입이 없습니다 (C++에있을 것이라고 믿습니다). – pmg