2009-03-07 4 views
2

C에서는 해당 함수를 호출하는 사람들 (읽기 전용)에게 읽기 전용으로 낮은 수준의 "관리되는"메모리를 노출 할 수 있습니다. return * const은 효과가 없지만 프로그래밍 틱을 간과했는지 궁금합니다.메모리를 읽기 전용으로 노출

감사합니다.

const uint8_t * get_value(int index) 
{ 
static uint8_t data[2] = {0, 0}; 
return (const uint8_t *)&data[index]; 
} 

int main(void) 
{ 
uint8_t * value; 
value = get_value(1); 

*value += 1; 
return 0; 
} 

@j_random_hacker은 내가 찾고 여분의 장벽 데이터의 캐주얼 잘못된 사용을 방지하기 위해 것을 제공합니다 내 질문에 좋은 타협을 제안했다.

typedef struct 
{ 
    const uint8_t * value; 
    const uint8_t size; 

} readonly_t; 

readonly_t get_value(int index, int size) 
{ 
    static uint8_t data[2] = {0, 0}; 
    uint8_t rsize; 

    /* ... validate index, size params */ 

    readonly_t r = { &data[index], rsize }; 
    return r; 
} 
+0

왜 이것이 커뮤니티 위키인지 알 수 없습니다. – TheTXI

+0

내 실수. 여기 저기에 약간의 클릭만으로 신속하게 제출 한 다음 제출할 수 있지만 실행 취소 할 수는 없습니다. – Oliver

답변

6

그것은 C입니다! 당신은 할 수 없습니다 :) 항상 우회하는 방법이 있습니다. 그냥 const으로 만들고 누군가가 변경하지 않기를 바랍니다.

추가 기능 등을 호스팅하는 경우 메모리 액세스를 제한하기 위해 별도의 프로세스에서 실행해야합니다.

+0

기술적으로 옳은 답변으로 표시된 답변 -이 시나리오에서는 실제 읽기 전용 기능을 사용할 수 없습니다. 입력 해 주셔서 감사합니다 – Oliver

1
+0

플랫폼에 따라 다르며 할당 세분도> = 4KB입니다. 하지만 그게 문제가 아니라면 ... :) – peterchen

+0

멀리 MS 플랫폼에서 작동하지 않습니다. OSEK OS 및 바닐라 C 사용, 표준 라이브러리 없음. – Oliver

+0

그래, 그 종류의 답답한 대답, 나는 동의한다. 그러나 나는 다른 사람들이 C로 그 불가능 성을 지적 할 것이라고 생각했다. 물론 호출자는 VirtualProtect()를 사용하여 상태를 변경할 수있다. 가장 좋은 방법은 일종의 핸들을 반환하고이를 내부적으로 불투명 한 데이터 구조에 매핑하는 것입니다. –

1

는 같이 값을 객체에 뾰족한를 반환 포인터를 반환하지 마십시오

uint8_t get_value(int index) 
{ 
    static uint8_t data[2] = {0, 0}; 
    return data[index]; 
} 
+0

길이는 n 바이트 일 수 있습니다. 예 : 구조 – Oliver

+0

그러면 이미 가지고있는 것은이 언어로 할 수있는 최선입니다. – dirkgently

+0

n이 고정되어 있으면 구조체에 배열을 래핑하여 해당 값을 반환 할 수 있습니다. C는 struct가 일급 값으로 취급되도록 허용하지만 (=로 할당 할 수 있고 함수에서 전달할 수 있음) 어떤 이유로 든 구조체가 아닌. –

0

메모리 보호는 'C에서 언어 구조 아니라, 하드웨어와 함께 할 수있는 뭔가입니다. 예를 들어, 포인터가 가리키는 메모리가 일부 ROM 영역 또는 다른 곳에 있으면 쓰기가 불가능합니다. 그리고 다른 방법으로는 하드웨어 레벨에서 ReadOnly의 일부를 만들 수도 있습니다. 그런 다음 일부 메모리 예외를 기대할 수 있습니다.

관련 문제