2016-08-17 9 views
2

홀수 번지의 메모리에 16 비트 액세스가 발생하면 dsPic30/33 및 18E/F 부품에서 메모리 오류가 발생합니다. malloc()을 사용하여 힙 메모리를 할당 할 때 반환 주소가 워드로 정렬되도록 보장됩니까? (즉 짝수)마이크로 칩 XC16에서 malloc()은 워드 정렬 주소를 생성하도록 보장됩니까?

malloc, 당신은 기억할 것입니다. 단어가 아닌 바이트 단위로 인수를 취합니다.

(16 비트 언어 도구 라이브러리 참조 설명서 50001456J.pdf) 찾을 수 있었던 설명서는이 문제에 대한 설명이 아닙니다.

==== 편집 : malloc()에서조차도 (단어 정렬 된) 주소 만 수신 했으므로 추가해야합니다. 모든 것이 잘 작동하고 있습니다. 그럼에도 불구하고 이상한 주소를 얻는다면 내 코드가 함정을 일으킬 것입니다 (왜냐하면 나는 ((uint16_t *)foo)[3] = 20000; 같은 것을 수행하기 때문입니다). 따라서 짝수 주소가 항상 malloc()에 의해 반환되도록하고 싶습니다.

+0

언어에 16 비트 액세스를 수행하는 모든 유형이 있습니까? 'some_type foo; foo = 3;'= '는 16 비트 액세스를합니까? 그렇다면'malloc' *이 작동해야합니다. –

+0

@DavidSchwartz 잘 구현이 도청되었을 가능성이 있습니다 –

+0

버그는 문서가 도움이되지 않습니다. 버그는 일반적으로 문서화되지 않았습니다. 실제 16 비트 타입을 가지고 있다면, malloc은 합법적 인 포인터를 주어야한다. –

답변

2

C 표준은 malloc()이 할당 내에 들어갈 수있는 객체에 대한 구현에 의해 부과 된 모든 메모리 정렬 요구 사항을 만족하는 포인터를 반환해야한다는 것을 명령합니다. 컴파일러가 정렬에 관계없이 작동하는 방식으로 모든 메모리 액세스를 처리하는 경우 malloc() 구현은 임의 정렬을 사용하여 포인터를 반환 할 수 있습니다. 많은 구현체는 필요한 정렬이 그렇게 거친 것이 아닐지라도 2, 4 또는 8 바이트의 배수로 정렬 된 포인터를 실제로 반환합니다. 그 이유는 그것보다 작은 여유 공간 영역을 다루지 않아도되기 때문입니다. 구현은 명시 적으로 그러한 행동이 변하지 않을 것이라고 기대해서는 안된다고 약속한다.

0

그냥 malloc을 피하십시오. MISRA/C 2004 :

규칙 20.4 (필수) : 동적 힙 메모리 할당을 사용해서는 안됩니다. [지정되지 않음 19; 정의되지 않은 91, 92; 구현 69; Koenig 32] 이것은 calloc, malloc, realloc 및 free 함수의 사용을 배제합니다. 동적 메모리 할당뿐만 아니라 수많은 잠재적 함정과 관련된 정의되지 않은, 정의되지 않은 구현 정의 동작의 모든 범위가 있습니다. 동적 힙 메모리 할당은 메모리 누수, 데이터 불일치, 메모리 고갈, non- 결정적 동작을 유발할 수 있습니다. 일부 구현에서는 다른 함수 (예 : 라이브러리 string.h의 함수)를 구현하기 위해 동적 힙 메모리 할당을 사용할 수 있습니다. 이 경우에는이 기능들도 피해야합니다 ( ).

100 개가 넘는 정수를 저장할 필요가 없다는 것을 알고 있다면 128 개의 요소 (예 :) 크기의 배열을 선언하기 만하면됩니다.

+0

"표준에 대한 좋은 점은 선택해야 할 것이 많다는 것입니다."- Andrew Tanenbaum 문제는 프로젝트의 여러 위치에서 사용되는 버퍼를 예로 들어 설명합니다. 일부 용도에는 작은 버퍼가 필요하고, 일부에는 큰 버퍼가 필요합니다. 동적 할당을 사용하면 인터페이스를 크게 단순화 할 수 있습니다. 많은 안전 핵심 응용 프로그램에는 "초기화 후 malloc 없음"또는 "일단 이륙이 시작되면 malloc 없음"과 같은 규칙이 있습니다. –

1

마이크로 칩은 지원 팀을 통해 XC16 malloc() 및 realloc()이 항상 짝수 주소를 반환 함을 확인했습니다.