A inspeção de pilha é necessária porque os programas na JVM e CLR têm acesso padrão a operações perigosas; portanto, algo deve ser feito para evitar desastres. Por exemplo, um programa não confiável pode fazer referência a uma biblioteca de E / S e chamá-la:
using IO;
...
IO.DeleteFile("/home/foo/bla");
Portanto, em cada operação perigosa feita, precisamos verificar se é permitida. Com a inspeção de pilha, geralmente é complicado entender quem tem acesso a quê. Também dificulta otimizações como inlining e tail calls.
Um mecanismo superior é não dar a cada programa acesso automático a operações perigosas em primeiro lugar. Nesse modelo, não há como importar uma biblioteca de E / S. A única maneira de obter acesso a uma biblioteca de E / S é se alguém lhe der. Isso é chamado de segurança de capacidade. Uma introdução pode ser encontrada aqui .
Em vez disso, escreveríamos o programa anterior como este:
Main(IOLibrary IO){
IO.DeleteFile("/home/foo/bla");
}
A biblioteca IO é um parâmetro para o ponto de entrada do programa, e isso é chamado de recurso (porque fornece algum recurso, nesse caso, para executar IO). Para poder executar este programa, precisamos ter acesso a um recurso de E / S e executar o programa chamando Main(ourIOlibrary)
. Se estamos executando um programa não confiável, simplesmente não passamos nossa biblioteca de E / S para ele, pois ele pode usar essa biblioteca para excluir nossos arquivos. Em alguns casos, queremos dar a um programa não confiável acesso limitado ao sistema de arquivos. Nesse caso, criamos um wrapper em torno de nossa própria biblioteca de E / S que permite apenas o acesso a um determinado diretório e passamos esse para o programa não confiável, em vez da biblioteca de E / S completa
Portanto, se precisarmos de um recurso de E / S para chamar um programa que precise de um recurso de E / S, isso também significa que tudo o que invocou nosso programa precisava ter acesso a um recurso de E / S para poder fornecê-lo. Então, de onde veio sua capacidade de IO? Bem, eventualmente, há um ponto em que o ser humano que opera o computador invocou um programa. Esse humano tem acesso a todos os recursos do sistema e, portanto, conseguiu passar o recurso de E / S. Se esse humano não confiar no programa que está executando, ele simplesmente não passará sua capacidade de IO para ele.
Provavelmente, você pode imaginar facilmente outros tipos de recursos: acesso à Internet, acesso para desenhar coisas na tela etc. Por exemplo, um sistema seguro de plug-in de navegador pode fornecer recursos gráficos a um plug-in não confiável que permite apenas pintar gráficos em um retângulo predefinido na página.