C ve Java arasındaki temel bir fark, eğer bir Java'nın kolayca tanımlanabilen bazı özelliklerinden (örneğin Unsafe
isim alanındakiler) kaçınılması halinde , "hatalı" olanlar da dahil olmak üzere - yapılabilecek her türlü eylemin sınırlı bir olası sonuç aralığına sahip olmasıdır. . Bu, Java’da yapılabilecekleri sınırlandırsa da - en azından Unsafe
ad alanını kullanmadan , aynı zamanda hatalı bir programın veya daha da önemlisi - doğru şekilde işleyebilecek bir programın neden olabileceği hasarı sınırlandırmayı da mümkün kılar. geçerli dosyalar ancak hatalı dosyalara karşı özellikle korunmuyor.
Geleneksel olarak, C derleyicileri "normal" durumlarda birçok çevre örneğini "çevreye özgü bir şekilde" işleme koyarken, standart tanımlı biçimde birçok eylemi işlerdi. Biri, sayısal taşma meydana gelirse ve CPU'nun ateş almasından kaçınmak istiyorsa, kısa devre yapan ve yangın çıkaran bir CPU kullanıyorsa, sayısal taşma olmaması için kod yazması gerekir. Bununla birlikte, eğer biri ikişeyi tamamlayıcı şekilde mükemmel şekilde mutlu bir şekilde kesecek bir CPU kullanıyorsa, böyle bir kesmenin kabul edilebilir bir davranışa yol açacağı durumlarda taşmalardan kaçınmak zorunda kalmazsınız.
Modern C, işleri bir adım öteye götürür: biri, Standart'ın hiçbir şart getirmediği sayısal taşma gibi bir davranışı doğal olarak tanımlayan bir platform hedeflese bile, bir programın bir bölümünde taşma, programın diğer bölümlerinin davranışını etkileyebilir. Program keyfi zaman ve nedensellik yasalarına bağlı değildir. Örneğin, şöyle bir şey düşünün:
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.
}
Yukarıdaki gibi bir şey verilen "modern" bir C derleyicisi, x * x'in hesaplanması eğer x 46340'tan büyükse taşması nedeniyle, koşulsuz olarak "foo" çağrısını yapabilir. Bir programın, x'in aralık dışı olması durumunda anormal şekilde sonlandırılması veya fonksiyonun bu gibi durumlarda herhangi bir değer döndürmesi kabul edilebilir olsa bile, aralık dışı x ile foo () işlevinin çok daha fazla zarara neden olabileceğini unutmayın. bu olasılıklardan herhangi biri. Geleneksel C, programlayıcı ve temel platformun sağladıkları ötesinde herhangi bir güvenlik donanımı sağlamaz, ancak güvenlik tertibatının beklenmeyen durumlardan gelen hasarı sınırlamasını sağlar. Modern C, her şeyi kontrol altında tutmada% 100 etkili olmayan güvenlik donanımlarını atlar.