Perbedaan mendasar antara C dan Java adalah bahwa jika seseorang menghindari fitur Java yang mudah diidentifikasi (misalnya yang ada di Unsafe
namespace), setiap tindakan yang mungkin dilakukan - termasuk yang "keliru" - akan memiliki sejumlah hasil yang terbatas. . Walaupun hal ini membatasi apa yang dapat dilakukan seseorang di Jawa - setidaknya tanpa menggunakan Unsafe
namespace, itu juga memungkinkan untuk membatasi kerusakan yang dapat disebabkan oleh program yang salah, atau - yang lebih penting - oleh program yang akan memproses dengan benar file yang valid tetapi tidak secara khusus dilindungi terhadap yang salah.
Secara tradisional, kompiler C akan memproses banyak tindakan dengan cara yang ditentukan standar dalam kasus "normal", sementara memproses banyak kasus sudut "dengan cara yang karakteristik lingkungan". Jika seseorang menggunakan CPU yang akan memendek dan terbakar jika numerik meluap dan ingin menghindari CPU yang terbakar, orang perlu menulis kode untuk menghindari kelebihan numerik. Namun, jika seseorang menggunakan CPU yang dengan sempurna akan memotong nilai dengan cara dua-pelengkap, seseorang tidak harus menghindari kelebihan dalam kasus di mana pemotongan tersebut akan menghasilkan perilaku yang dapat diterima.
Modern C mengambil langkah-langkah lebih jauh: bahkan jika seseorang menargetkan platform yang secara alami akan mendefinisikan perilaku untuk sesuatu seperti pelimpahan numerik di mana Standar tidak akan memaksakan persyaratan, melimpah di satu bagian dari program dapat memengaruhi perilaku bagian lain dari Program dengan cara sewenang-wenang yang tidak terikat oleh hukum waktu dan kausalitas. Sebagai contoh, pertimbangkan sesuatu seperti:
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.
}
Kompiler C "modern" yang diberi sesuatu seperti di atas mungkin menyimpulkan bahwa karena perhitungan x * x akan meluap jika x lebih besar dari 46340, ia dapat melakukan panggilan ke "foo" tanpa syarat. Perhatikan bahwa meskipun akan dapat diterima jika sebuah program berhenti secara tidak normal jika x berada di luar jangkauan, atau meminta fungsi mengembalikan nilai apa pun dalam kasus seperti itu, memanggil foo () dengan out-of-range x dapat menyebabkan kerusakan jauh melampaui salah satu dari kemungkinan itu. Tradisional C tidak akan menyediakan alat pengaman apa pun di luar apa yang disediakan oleh programmer dan platform yang mendasarinya, tetapi akan memungkinkan alat pengaman membatasi kerusakan dari situasi yang tidak terduga. Modern C akan mem-bypass setiap peralatan keselamatan yang tidak 100% efektif untuk menjaga semuanya terkendali.