2015-01-12 10 views
-1
Power_s.Ch1 = ((uint8)(((*RequestData)[0]) << 8) | ((*RequestData)[1])); 

- 그것은 다음과 같은 오류 던지고있다> :규칙 10.1, 복잡한 정수 표현의 암시 적 변환

  1. 이 변화의 오른쪽에 대한 경계 값에서, MISRA 2004 필요한 규칙 12.8을 위반하는을 운영자
  2. 는 MISRA 2004 필수 규칙 10.1, 복잡한 정수 표현

의 암시 적 변환을 어떻게이 문제를 해결하는 데에 위배된다? U8 피연산자를 1.Assuming

+0

친절하게 코드 서식을 지정하십시오. –

+0

'RequestData'의 타입은 무엇입니까? –

답변

0

, 7 비트가 UINT8보다 더 넓은 정수를 필요 이상으로 더 이동 왼쪽, 귀하의 경우에 당신이있다 UINT8보다 큰 유형으로 8

2.Assuming Power_s.Ch1에 의해 이동된다 unit8에서 더 높은 정수 유형으로의 암시 적 변환.

정수 승격 및 산술 변환 규칙을 확인하십시오. 시프트의 경우 일반적으로 단항 변환이 각 피연산자에 개별적으로 적용되며 결과 유형은 변환 된 왼쪽 피연산자의 유형입니다.

0

12.8에 따르면 시프트의 오른쪽 피연산자는 왼쪽 피연산자의 기본 유형의 비트 수보다 낮아야합니다. RequestDatauint8_t* 유형 인 경우 정적 분석기는 uint8_t를 8로 왼쪽으로 이동하는 것이 의미가 없다고 말합니다. RequestData이 다른 유형 인 경우 정적 분석기가 손상됩니다.

10.1은 실제로 암시 적 정수 유형 승격에 관한 것입니다.

uint8_t u8_result = (uint8_t)((*RequestData)[0] << SMALL_ENOUGH); 
Power_s.Ch1 = (uint8_t)(u8_result | (*RequestData)[1]); // assuming Power_s.Ch1 is uint8_t. 

당신은 거의 확실 위와 같이 여러 줄의 표현을 중단 할 것, 또는 때문에 많은 캐스트의 읽을 수있을 것입니다 : 다음과 같은 방식으로 코드를 수정합니다.