C와 Java의 근본적인 차이점은 Java의 식별하기 쉬운 특정 기능 (예 : Unsafe
네임 스페이스의 기능)을 피할 경우 "잘못된"기능을 포함하여 시도 할 수있는 모든 조치가 가능한 결과 범위가 제한된다는 것입니다. . 이것은 최소한 Unsafe
네임 스페이스 를 사용하지 않고 Java로 할 수있는 일 을 제한하지만, 잘못된 프로그램 또는 더 중요한 것은 올바르게 처리 할 수있는 프로그램으로 인해 발생할 수있는 손상을 제한 할 수 있습니다. 유효한 파일이지만 특히 잘못된 파일로부터 보호되지는 않습니다.
전통적으로 C 컴파일러는 "정상적인"경우에 표준 정의 방식으로 많은 작업을 처리하는 반면 "환경의 특성"으로 많은 코너 사례를 처리합니다. 수치 오버플로가 발생했을 때 단락되고 화재를 포착 할 수있는 CPU를 사용하고 있고 CPU 캐치 화재가 발생하지 않도록하려면 수치 오버플로를 피하기 위해 코드를 작성해야합니다. 그러나 2를 보완하는 방식으로 값을 완벽하게 자르는 CPU를 사용하는 경우 그러한 자르기가 허용 가능한 동작을 초래하는 경우 오버플로를 피할 필요가 없었습니다.
현대 C는 한 단계 더 나아갑니다. 표준이 요구 사항을 부과하지 않는 수치 오버플로와 같은 행동을 자연스럽게 정의하는 플랫폼을 대상으로하더라도 프로그램의 한 부분에서의 오버플로는 프로그램의 다른 부분의 행동에 영향을 줄 수 있습니다 시간과 인과 관계에 구속되지 않는 임의의 방식으로 프로그램 예를 들어 다음과 같은 것을 고려하십시오.
uint32_t test(uint16_t x)
{
if (x < 50000) foo(x);
return x*x; // Note x will promote to "int" if that type is >16 bits.
}
위와 같이 주어진 "현대"C 컴파일러는 x가 46340보다 크면 x * x 계산이 오버플로되므로 무조건 "foo"에 대한 호출을 수행 할 수 있다고 결론 지을 수 있습니다. x가 범위를 벗어난 경우 프로그램이 비정상적으로 종료되도록하는 것이 허용 가능하더라도,이 경우 함수가 범위를 벗어난 x로 foo ()를 호출하면 훨씬 더 큰 손상을 초래할 수 있습니다. 그 가능성 중 하나. 전통적인 C는 프로그래머와 기본 플랫폼이 제공하는 것 이상으로 안전 장치를 제공하지는 않지만 안전 장치가 예기치 않은 상황으로 인한 손상을 제한 할 수있게합니다. Modern C는 모든 것을 통제하는 데 100 % 효과적이지 않은 안전 장비를 우회합니다.