Estou adicionando autotestes ao código C ++, o que garante que não haja NDEBUG
e Posix declarar dependências (a história do verso abaixo). O primeiro teste procura a inclusão de <assert.h>
e <cassert>
:
FAILED=0
COUNT=$($EGREP -c '(assert.h|cassert)' *.h *.cpp)
if [[ "$COUNT" -ne "0" ]]; then
FAILED=1
echo "Found Posix assert headers" | tee -a "$TEST_RESULTS"
fi
Produzindo:
************************************
Testing: No Posix assert
./cryptest.sh: line 1130: [[: 3way: value too great for base (error token is "3way")
...
Quando eu depurar, vejo:
bash -x ./cryptest.sh
...
++ egrep -c '(assert.h|cassert)' 3way.h adler32.h aes.h ...
+ COUNT='3way.h:0
adler32.h:0
aes.h:0
...
Assim, cada arquivo recebe sua própria linha e conta.
A página grep
man indica o seguinte. Não discute a saída de várias linhas.
-c, --count
Only a count of selected lines is written to standard output.
O comportamento parece ter algo a ver com Controle de saída (da página man) e -l, --files-with-matches
. Eu também tentei a opção -L, --files-without-match
. Isso produz um erro semelhante.
Minha pergunta é: como posso grep
dobrar os resultados em uma contagem?
Ou talvez eu deva perguntar: grep e egrep são a ferramenta certa para o trabalho? Se grep e egrep não são a ferramenta certa, então o que devo usar?
Este é um script de shell Bash que é executado em todas as plataformas suportadas. Cada plataforma inclui BSDs, Linux, OS X, Solaris e Unix (e todas as variantes móveis, como Android e iOS). Temos que trabalhar para conseguir o que precisamos em termos de ferramentas como grep
e egrep
:
GREP=grep
EGREP=egrep
SED=sed
AWK=awk
DISASS=objdump
DISASSARGS=("--disassemble")
...
# Fixup
if [[ "$IS_SOLARIS" -ne "0" ]]; then
IS_X64=$(isainfo 2>/dev/null | "$GREP" -i -c "amd64")
if [[ "$IS_X64" -ne "0" ]]; then
IS_X86=0
fi
# Need something more powerful than the non-Posix versions
if [[ (-e "/usr/gnu/bin/grep") ]]; then
GREP=/usr/gnu/bin/grep;
fi
if [[ (-e "/usr/gnu/bin/egrep") ]]; then
EGREP=/usr/gnu/bin/egrep;
fi
if [[ (-e "/usr/gnu/bin/sed") ]]; then
SED=/usr/gnu/bin/sed;
fi
if [[ (-e "/usr/gnu/bin/awk") ]]; then
AWK=/usr/gnu/bin/awk;
else
AWK=nawk;
fi
DISASS=dis
DISASSARGS=()
fi
...
História anterior
Nosso projeto recentemente realizou CVE-2016-7420 devido a usuários que criaram o projeto com outras ferramentas, como Autotools e CMake. O CVE é um resultado direto da omissão de -DNDEBUG
para versões de release / produção. As outras ferramentas não configuram a maneira como fazemos, e também não informamos aos usuários (1) que não podem usar outras ferramentas de compilação ou (2) usuários devem definir -DNDEBUG
para lançamento / produção.
Nossas correções estão sendo muito mais profundas do que "simplesmente defina NDEBUG
para release / production" na documentação. Estamos destruindo todas as dependências em NDEBUG
e Posix assert
para que as pessoas não possam entrar acidentalmente na configuração. Também estamos exigindo que os usuários solicitem uma configuração de depuração definindo DEBUG
ou _DEBUG
; caso contrário, eles obtêm a configuração de lançamento.
Enquanto um assert
e o SIGART
que se segue são geralmente irritantes em compilações de lançamento, considerados benignos na compilação de depuração e tomados como garantidos, observamos:
- Somos uma biblioteca de segurança (lidamos com informações confidenciais)
- Uma falha na declaração de informações confidenciais dos egressos para o sistema de arquivos (arquivos principais e relatórios de falhas)
- Uma falha na afirmação de informações confidenciais de egressos para fornecedores de plataformas como Apple (CrashReporter), Apport (Ubuntu), Microsoft (Relatório de Erros do Windows)
- Empresas como Apple, Google e Microsoft cooperam com o governo para explorar as informações confidenciais