2011-09-28 9 views
3

MDN 자바 스크립트 가이드는 내용의 자바와 자바 스크립트 간의 비교 할 때 다음과 같은 : 예를 들어,Java 및 유형 안전

유형 안전 수단을 사용하면 객체 참조에 자바 정수를 캐스팅 할 수없는, 또는 Java 바이트 코드를 손상시켜 개인 메모리에 액세스하십시오.

는 물론, 위의 문장의 첫 부분에 대해 형 안전의 일반적인 개념을 입력에 대해 이야기 할 때하는 호환되지 않는 유형으로 수행 된 작업에 대한 가능한 오류 조건을 제거 검사의 어떤 종류를 제공 할 수있는 언어 능력을 중심으로 돌아 (위의 예제는 Java에서 기본 유형 intInteger으로 설정할 수 있다는 것을 고려하면 순진합니다.

하지만 성명서의 두 번째 부분은 정확히 무엇을 의미합니까?

Here 메모리 보호 수준을 보장하는 JVM의 확인 프로그램에 대한 이야기가 있습니다. 여기서는 "임의 비트 패턴을 주소로 사용할 수 없습니다."

MDN 성명서의 두 번째 부분은 유형 안전과 어떤 관련이 있습니까?

+0

* int는 참조 유형 Integer *로, 이것은 컴파일러 "마법"일뿐입니다. 내부적으로 (바이트 코드, jni) 형식이 전혀 호환되지 않습니다. – bestsss

답변

3

Java에서 유형을 식별하는 방법을 알아낼 수있는 방법은 없습니다. 자바 스크립트에서 데이터 유형을 나타내는 바이트 시퀀스의 방식에 따라 유형을 유추 할 수 있습니다. Java에서 VM은 Foo 객체로 의도 된 일련의 바이트를 Bar 객체로 볼 수 없도록 보장합니다.

비공개 멤버에 액세스한다는 것은 의도하지 않은 것에 대한 액세스 권한을 얻기 위해 바이트 시퀀스를 프로그래머가 의도 한 것과 다른 의미로 만들 수 없음을 의미합니다. 런타임시 전용 멤버 foobarfoo 개체는유형의 개체로 동일한 멤버가 있지만 foobar은 공개 된 개체로 변경할 수 없습니다. 각 객체의 유형은 런타임시 VM에 의해 제어되는 바이트 코드로 인코딩됩니다.

4

나는 그들이 C.

에서 당신이 할 수처럼 당신이 구문이 잘못된 경우
struct bar_s { 
    char foo_s[100]; 
} 

void stuff() { 
    int foo = 5; 
    bar_s *bar = &foo; 
} 

나를 용서, 다른 유형에 임의의 메모리 주소를 캐스팅 할 수 있다는 것을 의미 의심, 내 C 녹슨입니다. 이것은 foo의 메모리 주소를 취하여 bar_s 구조체에 대한 포인터에 할당합니다.이 구조체는 많은 관련 고통을 통해 역 참조 할 수 있습니다. 당신은 원래 bar_s의 int 인 메모리 영역을 다루고 있습니다.

C에는 임의의 정보로 메모리를 덮어 쓸 수있는 여러 가지 공격 경로가 있으며 그 다음에 실행됩니다. Buffer Overflow

자바에서는 한 번 정수, 항상 정수 [*]를 참조하십시오. 또한 버퍼 오버 플로우를 방지하는 데 도움이되는 모든 배열에 대한 경계 검사가 있습니다.

[*] 가비지 수집까지입니다.