2016-07-19 5 views
0

을 깰 것 32 비트 Cortex M0.유형 역 참조 형 punned 포인터가이 코드에 ('엄격한 앨리어싱 규칙을 깰 것이다 형 역 참조 타입 punned 포인터') 경고 컴파일러가 엄격한 앨리어싱 규칙

경고에도 불구하고 정상적으로 작동합니다. 제 질문은, 경고를 풀 수 있습니까?

+0

* strict aliasing * 규칙에 대해 읽어보십시오. 광범위한 주제입니다. –

+0

... 좋아하는 검색 엔진에 경고를 붙여 넣으려고 했습니까? 또는이 바로 사이트? –

+0

관련 : http://stackoverflow.com/questions/2958633/gcc-strict-aliasing-and-horror-stories –

답변

3

저장 기간을 다른 (호환되지 않는) 유형의 객체로 할당하지 않은 객체를 재 해석하는 것은 정의되지 않은 동작입니다.

예 : Buff 유형이 uint8_t이고 정적 저장 기간 또는 자동 저장 기간은 DWORD으로 재 해석됩니다. 이러한 유형은 호환되지 않습니다 , 동작이 정의되지 않았습니다.

당신은 단순히 DWORD 것으로 보인다 사용하려는 유형으로 Buff을 정의해야합니다 :

volatile DWORD Buff[READ_BUFF_SIZE]; 

을 다음 당신은 단순히 사용하여 액세스를 위해 매크로를 필요로하지 않는 내장 할 것 운영자 : 우리가 가정하더라도


1

ChunkID = Buff[0]; 
2 uint8_t는 unsigned char로 정의되며 모든 유형의 별명 일 수 있으며 DWORD 유형은 unsigned char이 아닐 수 있습니다. 유형 uint8_t이 CHAR_BIT이 확장 된 정수 유형을 참조 8. 경우에도 unsigned char로 정의되지 않은

2 표준 허용합니다.

+0

네, 괜찮은 대답입니다.하지만 질문의 중복을 줄이지는 않습니다. –

+0

@ JonathanLeffler '괜찮은'? :-) 그래, 나는 그것이 '일종의'dup이라고 생각한다. – 2501

+0

알았어, 이해가 돼! 나는 항상 경고가 생성되는 이유를 알고 싶다. 링크 주셔서 감사합니다, 나는 약간을 읽고 이해했습니다. 나는 그것을 사용하는 많은 루틴이 있기 때문에 uint8 이외의 것으로 버퍼를 선언 할 수 없다. 하지만 여러 다른 데이터에서 uint16, uint32 등으로 데이터를 이해할 수 있습니다. 원본 버퍼에서 유니온을 사용하여 좀 더 엘레강고하게 해결합니다. 감사. – user1797147

관련 문제