• Sonuç bulunamadı

3. BULGULAR YORUMLAR

3.8 Sekizinci Alt Probleme İlişkin Bulgular ve Yorumlar

Cumpre ressaltar que foi preciso criar meios para tratar as limitações do refinamento em B, tendo em vista possibilitar a verificação do modelo concreto da especificação Java Card quando

há mudança de interface em relação ao componente abstrato. No método B, não é possível modificar a interface da especificação em um refinamento posterior, mesmo que, intuitivamente, ainda haja equivalência entre os modelos abstratos e concretos. Em uma operação, isso inclui a representação dos tipos de dados, a ordem e a quantidade dos seus parâmetros de entrada e saída.

Observa-se que, em alguns casos, a mudança na interface concreta faz-se necessária, com o objetivo de compatibilizar esse modelo com as limitações de Java Card ou representar a recepção e envio de informações através do buffer adpu. Por exemplo, no caso da representação do tipo inteiro (int) de Java, uma vez que não é garantida a sua implementação em Java Card, deve-se representá-lo, no modelo concreto, como dois valores short ou como um array de bytes. É importante destacar que, no formalismo Event-B, contribuição recente derivada em parte do método B, a interface entre as operações refinadas pode ser modificada. Por outro lado, conforme discutido no capítulo 3 (seção 3.3), Event-B não é adequado ao desenvolvimento de software conforme proposto neste trabalho. Desse modo, preferiu-se continuar a utilizar o método B tradicional, buscando soluções para verificar o “refinamento” de módulos com interface distinta.

A seção 4.4.1 apresenta uma abordagem, desenvolvida nesta tese, que corresponde a uma forma de composição de módulos que resolve o problema da adaptação de interface sem a necessidade de se desviar do refinamento clássico de B. A título de ilustração, na seção 4.7, demonstra-se o uso da técnica de retrenchment [BP98], solução inicial pesquisada para contor- nar a restrição de mudança de interface. Trata-se de uma variante menos rigorosa do refinamento tradicional, e, por esse motivo, não foi incorporada ao método.

4.4.1 Um método de “refinamento” para permitir a mudança de interface

Nesta seção apresenta-se uma técnica, desenvolvida na presente tese, para permitir a ve- rificação da mudança de tipos e de interface entre um módulo abstrato e seu correspondente concreto, sem no entanto sair do escopo do método B tradicional.

Diante da impossibilidade de se verificar diretamente que a máquina Java Card (JC_App) é um refinamento da especificação Java inicial (J_App), o método proposto define um padrão de adaptação de interface a partir do refinamento do modelo abstrato. Para tanto, as operações refinadas devem manter a interface abstrata e as transições de estado em seu corpo devem ser feitas por meio das operações correspondentes do componente concreto (JC_App). Caso esse processo verifique-se correto, através da verificação das obrigações de prova do refinamento,

então é possível atestar que esses modelos são equivalentes.

O módulo J_ App_r (figura 4.11) representa o modelo a ser seguido para utilizar a técnica proposta. Para tanto, deve-se refinar a máquina abstrata Java (REFINES J_App) e incluir a especificação concreta (INCLUDES JC_App). No invariante, deve-se relacionar os estados des- ses modelos através de um invariante de ligação. No caso geral, em que a representação dos tipos concretos e abstratos é distinta, são utilizadas funções para converter o estado concreto no estado abstrato correspondente (na figura, j_v = java_of_jc ( jc_v )). Ressalta-se que deve ser fornecida, para cada tipo relacionado, uma função que faz o trabalho inverso, ou seja, que converte o estado abstrato em seu correspondente concreto (como jc_of_java (jc_param), no corpo da operação). Nesse caso, as funções são bijetoras, sendo uma inversa da outra.

REFINEMENT J_ App_r REFINES J_App

SEES J_Context, JC_Context, InterfaceContext INCLUDES JC_App

INVARIANT

j_v= java_of_jc ( jc_v ) OPERATIONS

j_r← j_operation ( j_param) = PRE j_param ∈ J_TYPE ∧

j_pre( j_param) = TRUE THEN

VAR tmp IN

tmp← jc_operation ( jc_of_java ( j_param)) ; j_r:= java_of_jc (tmp)

END END END

Figura 4.11: Refinamento da especificação abstrata inicial para verificar a correção da mudança de interface pelo módulo Java Card.

Observa-se que as operações de J_App_r possuem a mesma assinatura que o componente abstrato, dessa forma possibilitando o refinamento. A adaptação é feita no corpo da operação refinada, em um processo de três passos, para o caso de uma operação que possui parâmetros de entrada e retorno de dados:

1. Inicialmente, o valor armazenado nos parâmetros abstratos (j_param) é convertido em um valor equivalente no tipo concreto (jc_of _java(j_param));

2. Posteriormente, a operação concreta é aplicada sobre os dados concretos tmp ← jc_operation( jc_of _java(j_param));

3. Por fim, o resultado da aplicação da operação Java Card é convertido para o tipo abstrato e retornado (j_r := java_of _jc(tmp)).

As funções de conversão utilizadas para efetuar a relação de refinamento entre os estados abstratos e concretos são definidas na máquina InterfaceContext (figura 4.12). Essas funções, uma vez definidas e verificadas, podem ser reutilizadas em outros desenvolvimentos. Como tra- balhos futuros, deve-se prover uma versão do módulo InterfaceContext contendo um conjunto verificado de funções de conversão entre os tipos de dados mais comuns, por exemplo, entre tipos básicos e arrays de bytes. O módulo InterfaceContext também contém alguns corolários na cláusula ASSERTIONS que especificam propriedades adicionais para facilitar o trabalho de verificação do desenvolvimento.

MACHINE InterfaceContext SEES JInt , JCInt

CONSTANTS java_of_jc, jc_of_java PROPERTIES

java_of_jc∈ JC_TYPE ֌։ JAVA_TYPE ∧ jc_of_java∈ JAVA_TYPE ֌։ JC_TYPE ∧ jc_of_java−1= java_of_jc

ASSERTIONS

java_of_jc−1= jc_of_java ∧ dom ( java_of_jc ) = JC_TYPE ∧ dom ( jc_of_java ) = JAVA_TYPE END

Figura 4.12: A máquina InterfaceContext.

Destaca-se também que, nesta proposta, uma vez que se tenha provado a equivalência dos componentes abstratos e concretos para alguma representação de tipo, obtidas através da correta verificação do refinamento J_App_r, torna-se possível reusar a abordagem para esses tipos em outros desenvolvimentos semelhantes, sem a necessidade de verificá-los novamente.

Ressalta-se que, na versão atual do método, o desenvolvimento desta etapa é feito de forma manual. Pretende-se automatizar esse processo através de uma ferramenta que gere (ao menos em parte) o padrão de refinamento proposto a partir dos modelos Java e Java Card.