12 · Derivando pins¶
Os pins dizem quando uma obrigação se aplica, e um pin errado dá uma resposta correta à pergunta errada
(capítulo 4). Escrever bem os pins exige saber como o motor compila uma política;
conferir uma condição declarada contra uma regra exige conhecer a regra. A segunda é a habilidade que a
maioria dos revisores tem, então o modo derive_pins transforma escrever os pins em conferi-los.
O que ele calcula¶
Dada uma tabela de propriedades versionada, o derive_pins calcula, para cada obrigação, a condição
mais fraca sob a qual ela vale, em vez de prová-la sob os pins que alguém escolheu. Ele pergunta cada
obrigação primeiro sem pins, já que uma que vale incondicionalmente é estritamente mais forte que uma que
vale sob alguma condição. Depois, para cada condição que os ramos da política sugerem, ele retira um pin
de cada vez enquanto a obrigação continuar valendo.
derived = client.derive_pins("properties.json")
for record in derived.records:
if record.get("summary"):
continue
print(", ".join(record["ids"]), record["minimal_pin_sets"], record["reads_as"])
print(derived.summary.get("conditions_no_row_covers"), "condition(s) no row covers")
Cada obrigação volta com os seus minimal_pin_sets e uma frase que um revisor pode confrontar com a
regra que ela deveria aplicar:
risk_warning_givengatesrespond with permitted high risk answerexactly when$product_is_nmmior$product_is_rmmi.
Ou seja: o aviso de risco protege a resposta de alto risco exatamente quando o produto é um NMMI ou um RMMI. Isso não é um conjunto de pins para copiar. É uma afirmação que alguém pode rejeitar: o aviso só é aplicado a estes dois produtos ou é o que a regra diz, ou é um achado.
Os quatro contadores do resumo¶
| Contador | O que significa |
|---|---|
rows_with_redundant_pins |
a obrigação vale sem os seus pins, então eles a enfeitavam em vez de sustentá-la. Não é uma falha: reescreva a linha sem eles, ou mantenha as duas formas de perguntar como um pin_pair onde os pins declaram a própria condição da regulação (capítulo 11) |
conditions_no_row_covers |
o que deve ser tratado como defeito. A política aplica a obrigação sob uma condição sobre a qual nenhuma linha da tabela pergunta, então a tabela parece ter provado esse ramo, e não provou |
obligations_with_incomparable_minima |
a obrigação é aplicada sob duas ou mais condições, nenhuma das quais implica outra. Cada uma é uma afirmação separada e precisa de uma linha própria. Não é um defeito por si só, desde que todas estejam cobertas, o que o contador anterior confere |
rows_a_weaker_condition_would_carry |
uma linha fixa mais pins do que precisa. Não está errado, e vale a pena ver: quanto mais estreita a pergunta, mais uma resposta limpa deixa sem dizer |
Uma condição não tem contador. Uma obrigação com minimal_pin_sets vazio é uma que a política nunca
exige em nenhum caminho: ela aparece no registro dessa obrigação e em nenhum dos quatro totais. Um
pipeline que lê só a linha de resumo não a verá, então leia também os registros. É um defeito diferente
de uma proteção que pode ser contornada: a verificação está ausente de um caminho, em vez de contornável
nele, e nenhum pin salva essa linha.
A ressalva¶
Derivar os pins não os valida. A condição é lida dos próprios ramos da política. Se a regra exige uma obrigação incondicionalmente e a política só a confere dentro de um ramo, a condição derivada é esse ramo, e a obrigação vale sob ela. Nada no motor consegue detectar isso, porque nada no motor conhece a regra. O que muda é o que o revisor recebe: aplicado só quando o produto é um NMMI é uma frase que alguém pode confrontar com o regulamento e rejeitar, e um pin numa requisição não é.
Os limites¶
- Uma condição derivada é a da política, não a da regra. É uma proposta para um revisor, e o revisor decide se ela é a condição que a regra quer dizer.
- Uma obrigação que a política nunca exige não tem conjunto mínimo nem contador; leia os registros.
- A derivação é sobre as linhas da tabela. Uma linha que ninguém escreveu não tem derivação.