Một điểm khác biệt cơ bản giữa C và Java là nếu một người tránh được một số tính năng dễ nhận biết nhất định của Java (ví dụ: trong các Unsafe
không gian tên), mọi hành động có thể xảy ra có thể xảy ra - bao gồm cả những lỗi "sai lầm" - sẽ có phạm vi kết quả có thể hạn chế . Mặc dù điều này giới hạn những gì người ta có thể làm trong Java - ít nhất là không sử dụng Unsafe
không gian tên, nhưng nó cũng giúp hạn chế thiệt hại có thể gây ra bởi một chương trình sai lầm, hoặc - quan trọng hơn - bởi một chương trình sẽ xử lý chính xác các tập tin hợp lệ nhưng không được bảo vệ đặc biệt chống lại các tập tin sai.
Theo truyền thống, trình biên dịch C sẽ xử lý nhiều hành động theo kiểu được định nghĩa chuẩn trong các trường hợp "bình thường", trong khi xử lý nhiều trường hợp góc "theo cách đặc trưng của môi trường". Nếu một người đang sử dụng CPU sẽ tắt và bắt lửa nếu xảy ra tràn số và muốn tránh CPU bắt lửa, người ta sẽ cần phải viết mã để tránh tràn số. Tuy nhiên, nếu một người đang sử dụng CPU có thể cắt giảm hoàn toàn các giá trị theo kiểu bổ sung hai, thì người ta không phải tránh tràn ra trong trường hợp việc cắt ngắn như vậy sẽ dẫn đến hành vi chấp nhận được.
Modern C đưa mọi thứ đi xa hơn: ngay cả khi một người đang nhắm mục tiêu một nền tảng sẽ xác định một cách tự nhiên một hành vi cho một thứ gì đó như tràn số, trong đó Tiêu chuẩn sẽ không áp đặt yêu cầu, việc tràn vào một phần của chương trình có thể ảnh hưởng đến hành vi của các phần khác của chương trình theo kiểu tùy tiện không bị ràng buộc bởi quy luật thời gian và nhân quả. Ví dụ, hãy xem xét một cái gì đó như:
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.
}
Trình biên dịch C "hiện đại" được cung cấp giống như ở trên có thể kết luận rằng vì tính toán của x * x sẽ tràn nếu x lớn hơn 46340, nó có thể thực hiện lệnh gọi "foo" vô điều kiện. Lưu ý rằng ngay cả khi chương trình kết thúc một cách bất thường nếu x nằm ngoài phạm vi hoặc hàm có trả về bất kỳ giá trị nào trong các trường hợp đó, việc gọi foo () với x ngoài phạm vi có thể gây ra thiệt hại vượt xa một trong những khả năng đó C truyền thống sẽ không cung cấp bất kỳ thiết bị an toàn nào ngoài những gì lập trình viên và nền tảng cơ bản được cung cấp, nhưng sẽ cho phép thiết bị an toàn hạn chế thiệt hại từ các tình huống bất ngờ. Modern C sẽ bỏ qua mọi thiết bị an toàn không hiệu quả 100% trong việc kiểm soát mọi thứ.