할당된 메모리 청크를 읽기 전용으로 표시하는 방법이 있습니까?
메모리를 할당하면malloc()
읽기 전용으로 표시할 수 있는 방법이 있습니다.memcpy()에 쓰려고 하면 실패하는 건가요?
이는 사용자가 메서드에 의해 반환된 const 포인터를 잘못 사용하고 있는 잘못된 API 설계에 연결되어 있습니다.GetValue()
대용량 메모리 구조의 일부입니다.대용량 메모리 청크의 복사를 피하고 싶기 때문에 특정 형식의 구조화된 메모리 내에서 라이브 포인터를 반환합니다.문제는 일부 사용자가 이 메모리에 직접 쓰기를 통해 해킹을 찾아내고 우리가 개발한 메모리 바이너리 포맷을 적절히 할당하고 처리하는 SetValue() 호출을 피한다는 것입니다.사용자가 오버라이드한 제어 플래그를 잘못 해석하여 메모리 액세스 위반이 발생할 수 있습니다.
사용자를 교육하는 것도 하나의 작업이지만, 현재로서는 코드가 실패하기를 원합니다.
나는 단지 우리가 이 사건으로부터 단순히 보호할 수 있는지 궁금할 뿐이다.
예를 들어, 누군가가 sqlite 문에서 blob 열을 가져와서 거기에 회신한다고 가정합니다.sqlite의 경우 말이 안 되지만 우리의 경우 다소 이런 일이 발생합니다.
대부분의 하드웨어 아키텍처에서는 메모리 페이지 전체의 보호 속성만 변경할 수 있습니다.페이지의 단편은 읽기 전용으로 표시할 수 없습니다.
관련 API는 다음과 같습니다.
mprotect()
UNIX의 경우VirtualProtect()
를 클릭합니다.
메모리 페이지에 읽기 전용으로 하고 싶지 않은 내용이 포함되어 있지 않은지 확인해야 합니다.이 작업을 수행하려면 다음 중 하나로 오버랩해야 합니다.malloc()
또는 다음과 같은 다른 할당 API를 사용합니다.mmap()
,posix_memalign()
또는VirtualAlloc()
.
플랫폼에 따라 다릅니다.Linux 에서는, mprotect()(http://linux.die.net/man/2/mprotect) 를 사용할 수 있습니다.
Windows 에서는 VirtualProtect() (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspx) 를 사용해 볼 수 있습니다.한 번도 안 써봤는데.
편집: NPE의 답변이 중복되지 않습니다.NPE는 원래 다른 응답을 가지고 있었습니다.나중에 편집되어 mprotect()와 VirtualProtect()가 추가되었습니다.
사용자가 대용량 메모리 구조의 일부인 메서드 GetValue()에 의해 반환된 const 포인터를 잘못 사용하고 있는 잘못된 API 설계입니다.대용량 메모리 청크의 복사를 피하고 싶기 때문에 특정 형식의 구조화된 메모리 내에서 라이브 포인터를 반환합니다.
이는 API 설계에 결함이 있는 것은 아닙니다.API는 계약입니다.클래스가 특정 방식으로 동작할 것을 약속하면 클래스의 클라이언트는 API를 적절하게 사용할 것을 약속합니다.이런 더러운 속임수const_cast
가 부적절합니다(모든 경우에 정의되지 않은 동작이 있는 것은 아닙니다).
API 설계에 오류가 있을 수 있습니다.const_cast
보안 문제로 이어지다이 경우 메모리 청크를 복사하거나 API를 재설계해야 합니다.이것은 Java의 표준이며, Java는 (비록)에 상당하지 않습니다.const
자바어로 예약된 단어입니다.)
포인터를 관찰합니다. 즉, 포인터와 오프셋을 클라이언트에 반환합니다. 이제 포인터를 직접 사용할 수 없습니다.포인터가 공식 API를 통해 코드로 전달될 때마다 오프셋을 빼고 평소처럼 포인터를 사용하십시오.
언급URL : https://stackoverflow.com/questions/14931477/is-there-a-way-to-mark-a-chunk-of-allocated-memory-readonly
'programing' 카테고리의 다른 글
범위 내에서 임의의 정수값을 생성하는 방법 (0) | 2022.08.16 |
---|---|
포인터를 전달하는 것이 아니라 C의 값으로 구조물을 통과하는 단점이 있습니까? (0) | 2022.08.16 |
Vue 템플릿에서 'this'를 사용하시겠습니까? (0) | 2022.08.16 |
Vue / Vuex : 입력 바인딩된 값이 업데이트되기 전에 트리거된 붙여넣기 이벤트 (0) | 2022.08.16 |
Vuetify로 이미 페이지 처리된 데이터 처리 (0) | 2022.08.16 |