Development/Tutorials/Code Checking (pt BR): Difference between revisions

From KDE TechBase
No edit summary
No edit summary
 
(24 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/Code Checking}}
 




Line 5: Line 5:
Há muitas maneiras de encontrar bugs no código do KDE. Cada vez mais, os desenvolvedores do KDE estão usando ferramentas automatizadas. Você pode usar algumas dessas ferramentas para melhorar o seu próprio código.
Há muitas maneiras de encontrar bugs no código do KDE. Cada vez mais, os desenvolvedores do KDE estão usando ferramentas automatizadas. Você pode usar algumas dessas ferramentas para melhorar o seu próprio código.


===The KDE 'Krazy' Checker===
===O KDE 'Krazy' Checker===
Desenvolvedores do KDE tem um simples conjunto de testes que são conhecidos coletivamente como "Krazy". Esses testes foram desenvolvidos originalmente para ser executado como parte de um conjunto de testes em uma máquina conhecida como [http://www.englishbreakfastnetwork.org http://www.englishbreakfastnetwork.org], ou EBN. Você pode ver os resultados da execução de diversos testes noEBN (em http://www.englishbreakfastnetwork.org/krazy/).
Desenvolvedores do KDE tem um simples conjunto de testes que são conhecidos coletivamente como "Krazy". Esses testes foram desenvolvidos originalmente para ser executado como parte de um conjunto de testes em uma máquina conhecida como [http://www.englishbreakfastnetwork.org http://www.englishbreakfastnetwork.org], ou EBN. Você pode ver os resultados da execução de diversos testes noEBN (em http://www.englishbreakfastnetwork.org/krazy/).


Line 11: Line 11:


====Como funciona o Krazy====
====Como funciona o Krazy====
The Krazy tests are essentially a form of static analysis - they check the
Os testes Krazy são essencialmente uma forma de análise estática - verifica o código-fonte, mas não como ele é executado.
source code, but not how it runs.
 
Krazy exists as a framework comprising a number of different test runners, and
a set of plugins. The test runners are called krazy2, krazy2all, and krazy2ebn. The test runners just call one or more plugins on the appropriate code, and
format the results for display.
 
At this stage, most of the test runners are written in perl, however one is
written in C++ (using Qt) and it is quite possible to add your own tests, or
to modify a test - all sources are provided.


Krazy existe como um quadro composto por uma série de corredores de teste diferentes, e um conjunto de plugins. Os corredores de teste são chamados krazy2, krazy2all e krazy2ebn. Os corredores de teste apenas chamar um ou mais plugins no código apropriado, e formatar os resultados para mostrar.
Krazy existe como um framework formado por diferentes testes, e um conjunto de plugins. Os testes são chamados de krazy2, krazy2all e krazy2ebn. Os testes apenas chamam um ou mais plugins no código apropriado, e formatam os resultados para mostrar.


Nesta fase, a maioria dos corredores de teste são escritos em perl, porém é uma
Nesta fase, a maioria dos testes são escritos em perl, porém um
escrito em C + + (usando Qt) e é bem possível adicionar seus próprios testes, ou
escrito em C + + (usando Qt) e é bem possível adicionar seus próprios testes, ou
para modificar um teste - todas as fontes são fornecidos.
para modificar um teste - todas o código fonte é fornecido.


====Intsalando o Krazy====
====Instalando o Krazy====
Krazy needs to be installed before use. Krazy has two different ways to be
Krazy precisa ser instalado antes de usar. Krazy tem duas formas diferentes de ser instalado - você pode modificar o script {{path|krazy2/install.sh}} e
installed - you can either modify the {{path|krazy2/install.sh}} script and
executá-lo, ou siga as instruções no arquivo  [http://gitorious.org/krazy/krazy/trees/master krazy2/install.txt]. Eu recomendo a segunda opção.
run it, or follow the instructions in the [http://gitorious.org/krazy/krazy/trees/master krazy2/install.txt] file. I recommend the second.


You may need to install additional perl modules like XML::LibXML, here is how:
Você pode precisar instalar módulos adicionais do perl como XML::LibXML, veja como:
  linux-pudb:~/krazy2 # ./install.sh  
  linux-pudb:~/krazy2 # ./install.sh  
  MakeMaker FATAL: prerequisites not found.
  MakeMaker FATAL: prerequisites not found.
Line 39: Line 29:
     XML::LibXML not installed
     XML::LibXML not installed
   
   
Please install these modules first and rerun 'perl Makefile.PL'.
  Por favor instale esses primeiros módulos e execute novamente 'perl Makefile.PL'.
  linux-pudb:~/krazy2 # perl -mCPAN -e CPAN::shell
  linux-pudb:~/krazy2 # perl -mCPAN -e CPAN::shell
You may have to answer 25 useless questions here. In this case, just press ENTER 25 times. Then you go on like this:
 
Você talvez tenha que responder 25 questões sem utilidade aqui. Neste caso, pressione ENTER 25 vezes. Então você chega aqui:
  cpan[1]> install XML::LibXML
  cpan[1]> install XML::LibXML


The Tie::IxHash I installed from the distro repository (libtie-ixhash-perl) and also the perl-doc package is needed to install it.
O Tie::IxHash eu instalei a partir do repositório da distro (libtie-ixhash-perl) e também o pacote perl-doc é necessário para instalar.


{{Note|I had a minor problem with the plugin that is built from C++, because that plugin got installed into the wrong directory. If you are missing the passbyvalue plugin, then you may need to move it into the directory that contains the rest of your plugins.}}
{{Note|Eu tive um pequeno problema com o plugin que é construída a partir do C + +, porque instalei o plugin no diretório errado. Se estiver faltando o passbyvalue plugin, então talvez seja necessário para movê-lo para o diretório que contém o resto de seus plugins.}}


Krazy precisa ser instalado antes do uso. Krazy tem duas formas diferentes de ser
====Usando o Krazy====
instalado - você pode modificar o caminho {{|}} krazy2/install.sh script e
Krazy vem com uma página principal muito boa, que lhe dá várias
executá-lo, ou siga as instruções no arquivo [http://gitorious.org/krazy/krazy/trees/master krazy2/install.txt]. Eu recomendo o segundo.
opções e um exemplo de uso. O arquivo é gerado na instalação. Esta é definitivamente uma leitura recomendada!


Você pode precisar instalar módulos adicionais do perl como XML:: libxml, é aqui como:
Como mencionado acima, existem três testes - krazy2, krazy2ebn and krazy2all. Se você está tentando verificar um único arquivo, então krazy2 é a ferramenta certa. Se você está tentando verificar uma árvore (por exemplo, uma aplicação ou todo um módulo versionado), então krazy2all é mais útil. krazy2all não tem uma página, mas você pode obter uma lista das opções com krazy2all --help. Você também pode usar krazy2 para obter informações sobre os vários plugins que podem ajudar você a entender mais sobre krazy2all.
pudb linux: ~ /. krazy2 # / install.sh
MakeMaker FATAL: pré-requisitos não encontrados.
    Gravata: IxHash não instalado
    XML:: LibXML não instalado
Por favor instalar esses primeiros módulos e 'Makefile.PL perl' reprise.
pudb-linux: ~ / krazy2 # perl-MCPAN-CPAN:: Shell
Você pode ter que responder 25 perguntas inúteis aqui. Neste caso, apenas pressione ENTER 25 vezes. Então você ir sobre como este:
cpan [1]> instalar o XML:: libxml


O Empate: IxHash eu instalei a partir do repositório distro (libtie-ixhash-perl) e também o pacote perl-doc é necessário para instalá-lo.
krazy2ebn é a ferramenta que roda sobre o código base do KDE, a [http://www.englishbreakfastnetwork.org EBN] e não deve ser executado localmente. No entanto, por favor consulte [[# Controlando Krazy na EBN | Controle Krazy sobre] EBN] abaixo para saber como você pode controlar quais plugins são executados, e que os arquivos são processados pelo programa krazy2ebn na máquina EBN.


{{Note | Eu tive um pequeno problema com o plugin que é construída a partir do C + +, porque tenho esse plugin instalado no diretório errado. Se você estiver faltando o passbyvalue plugin, então talvez seja necessário para movê-lo para o diretório que contém o resto de seus plugins.}}
Lembre-se que Krazy não altera o seu código - apenas examina. Assim, você pode experimentar de modo seguro executando verificações do Krazy até ter certeza de que você entenda o que está acontecendo.


====Using Krazy====
Da mesma forma, o que significa que Krazy não resolve os problemas - só tenta reportá-los. Entendendo o que está sendo reportado, e como corrigir, é com você. Você também deve lembrar que a política de commit do KDE é de não dar commit em código que você não entende. Assim, corrigir de um erro de ortografia em um comentário é bastante seguro, mas alterar cegamente o código para parar os avisos do Krazy não é uma boa idéia.
Krazy comes with a particularly good man page, which gives you the various
options and a usage example. The file is generated on installation. This is definitely recommended reading!


As noted above, there are three test runners - krazy2, krazy2ebn and krazy2all. If you are trying to check a single file, then krazy2 is the right tool. If you are trying to check a source tree (say, an application or a whole subversion module), then krazy2all is more useful. krazy2all doesn't have a man page, but
you can get a list of the options with krazy2all --help. You can also use krazy2 to get information on the various plugins, which can help you understand more about krazy2all.


krazy2ebn is the tool that runs over the KDE codebase on the [http://www.englishbreakfastnetwork.org EBN] and should not be run locally.
====Diretivas In-Code====
However, please see [[#Controlling Krazy on the EBN|Controlling Krazy on the EBN]] below to learn how you can control which plugins are run, and what files are processed by the krazy2ebn program on the EBN machine.
Os plugins do Krazy suportam a seguinte lista de diretivas in-code:
* <tt>//krazy:skip</tt> - nenhum teste será executado nesse arquivo.
* <tt>//krazy:excludeall=<name1[,name2,...,nameN]></tt> - os testes do Krazy ''name1'', etc não serão executados nesses arquivos. Múltiplas ocorrência de  krazy:excludeall são permitidas.
* <tt>//krazy:exclude=<name1[,name2,...,nameN]></tt> - os testes ''name1'', etc. não serão executados na linha onde essa diretiva for encontrada (veja a [[#Omitindo false-positives|next section]] abaixo para mais informações).


Remember that Krazy doesn't change your code - it only examines it. So you can safely experiment with running Krazy checks until you are confident that you understand what is happening.
Note que essas diretivas devem ser no estilo dos comentários em C++ que podem ser colocados em qualquer lugar no arquivo (exceto embutido em comentários em C)


Equally, that means that Krazy doesn't fix problems - it only tries to report them. Understanding what is being reported, and how to fix it, is up to you. You should also remember the KDE commit policy about not committing code that you don't understand. So fixing a spelling error in a comment is pretty safe, but blindly changing code to stop explicit constructor warnings from Krazy is not a good idea.
====Omitindo false-positives====
Os testes Krazy são projetados para minimizar os false-positives (isto é, os alertas que não representam problemas reais). No entanto, porque a maioria dos testes são realizados em uma única linha, existem alguns testes que podem produzir um false-positive. Por exemplo, o código que faz algo como:


====In-Code directives====
<syntaxhighlight lang="cpp-qt">
The Krazy plugins support the following list of in-code directives:
QString mystring;
* <tt>//krazy:skip</tt> - no Krazy tests will run on this file.
mystring += "/";
* <tt>//krazy:excludeall=<name1[,name2,...,nameN]></tt> - the Krazy tests ''name1'', etc will not be run on this file. Multiple occurrences of krazy:excludeall are allowed.
</syntaxhighlight>
* <tt>//krazy:exclude=<name1[,name2,...,nameN]></tt> - the Krazy tests ''name1'', etc. will not be run on the line where this directive is found (see the [[#Suppressing false-positives|next section]] below for more information).


Note that these directives must be C++ style comments that can be put anywhere in the file desired (except embedded within C-style comments).
Será sinalizado pelo verificador doublequote_chars, porque é mais eficiente para adicionar um caracter simples, como mostrado abaixo:


====Suppressing false-positives====
<syntaxhighlight lang="cpp-qt">
The Krazy tests are designed to minimise false positives (that is, alerts that do not represent real problems). However because most of the tests are conducted on a single line, there are some tests that might produce such a false positive. For example, code that does something like:
<code cppqt>
QString mystring;
mystring += "/";
</code>
will be flagged by the doublequote_chars checker, because it is more efficient to add a single char, as shown below:
<code cppqt>
QString mystring;
QString mystring;
// note that we are using single quotes
// note that we are using single quotes
// this is a char, not a char array
// this is a char, not a char array
mystring += '/';  
mystring += '/';  
</code>
</syntaxhighlight>


That same checker will produce a false positive for code that looks like:
Esse mesmo verificador irá produzir um falso positivo para o código seguinte:
<code cppqt>
<syntaxhighlight lang="cpp-qt">
std::string mystring;
std::string mystring;
mystring += "/";
mystring += "/";
</code>
</syntaxhighlight>


You can suppress these false positives using a special comment format.
Você pode suprimir esses falsos positivos, usando um formato de comentário especial. Para excluir um plugin específico de ser executado em uma linha de código, basta adicionar um comentário em C++ que contenha a string "krazy:exclude=<plugin_name>". Os plugins disponíveis atualmente podem ser encontrados no
To exclude a particular plugin from being run on a line of code, simply add
a C++ comment containing the string "krazy:exclude=<plugin_name>". The plugins currently available can be found in the
[http://gitorious.org/krazy/krazy/trees/master repository].
[http://gitorious.org/krazy/krazy/trees/master repository].


Specifically, for this plugin use "krazy:exclude=doublequote_chars".
Especificamente, para este plugin use "krazy:exclude=doublequote_chars".
For example:
Por exemplo:
<code cppqt>
<syntaxhighlight lang="cpp-qt">
   lenstr = "0" + lenstr;
   lenstr = "0" + lenstr;
</code>
</syntaxhighlight>
becomes
becomes
<code cppqt>
<syntaxhighlight lang="cpp-qt">
   lenstr = "0" + lenstr;  // krazy:exclude=doublequote_chars
   lenstr = "0" + lenstr;  // krazy:exclude=doublequote_chars
</code>
</syntaxhighlight>


{{Note|Using c-style (/* */) comments will ''not'' work. You must use C++ style (//) comments when noting tests to be skipped.}}
{{Note|Usando o estilo C (/* */) comentários ''não'' vão funcionar. Você deve usar o estilo C++ (//) de comentários quando notar testes sendo ignorados.}}


====Controlling Krazy on the EBN====
====Controlando Krazy no EBN====
This section describes how to use ''.krazy'' files to control the Krazy runs on the [http://www.englishbreakfastnetwork.org EBN].  The ''.krazy'' files are used to tell Krazy to skip over specific sub-directories, or files; or to disable certain plugins within those modules and sub-directories.
Essa seção descreve como usar os arquivos ''.krazy'' para controlar a execução do Krazy no [http://www.englishbreakfastnetwork.org EBN].  Os arquivos ''.krazy'' são usados para dizer ao Krazy ignorar específicos sub-diretórios ou arquivos, ou desativar certos plugins dentro desses módulos e sub-diretórios.


To ignore a sub-directory within a module, say {{path|kdepim/kmail}}, use the IGNORESUBS directory within the {{path|kdepim/.krazy}} file, like so:
Para ignorar um sub-diretório dentro de um módulo, por exemplo {{path|kdepim/kmail}}, use o diretório IGNORESUBS dentro do arquivo {{path|kdepim/.krazy}}, assim:


<code>
<syntaxhighlight lang="text">
IGNORESUBS kmail
IGNORESUBS kmail
</code>
</syntaxhighlight>


Or you can ignore a set of directories by specifying a comma-separated list:
Ou você pode ignorar um conjunto de diretórios especificando uma lista separada
por vírgulas:


<code>
<syntaxhighlight lang="text">
IGNORESUBS kmail,kontact,knode
IGNORESUBS kmail,kontact,knode
</code>
</syntaxhighlight>


To ignore files or directories within a module/subdir, specify a regular expression that matches the files to skip together with the SKIP directive.
Para ignorar arquivos ou diretórios dentro de um módulo/subdir, especifique
For example, to skip the directories {{path|kdepimlibs/kcal/libical}}, {{path|kdepimlibs/kcal/versit}}, and the {{path|kdepimlibs/kcal/fred.c}} file, use this directive within the {{path|kdepim/kcal/.krazy}} file:
uma expressão regular que coincida com os arquivos para passar juntamente com a
directiva SKIP. Por exemplo, para ignorar os diretórios{{path|kdepimlibs/kcal/libical}}, {{path|kdepimlibs/kcal/versit}}, e o arquivo {{path|kdepimlibs/kcal/fred.c}}, use a diretiva dentro do arquivo {{path|kdepim/kcal/.krazy}}:


<code>
<syntaxhighlight lang="text">
SKIP /libical/\|/versit/\|fred\.c
SKIP /libical/\|/versit/\|fred\.c
</code>
</syntaxhighlight>


Use the EXCLUDE directive to disable a list of plugins for all files within a module/subdir:
Use a diretiva EXCLUDE para desativar uma lista de plugins para todos os
arquivos dentro de um módulo/subdir:


<code>
<syntaxhighlight lang="text">
EXCLUDE doublequote_chars,qclasses
EXCLUDE doublequote_chars,qclasses
</code>
</syntaxhighlight>


To override the EXCLUDE directive set from a {{path|.krazy}} file up in the directory hierarchy, use the CHECK commandFor example, the component level {{path|.krazy}} file may EXCLUDE the ''copyright'' and ''license'' plugins, but those plugins can be re-enabled in a module/subdir with the CHECK directive like so:
Para substituir a diretiva EXCLUDE coloque um arquivo {{path|.krazy}} na hierarquia de diretórios, use o comando CHECK.  Por exemplo, o nível do componente do arquivo {{path|.krazy}} deve EXCLUDE os plugins ''copyright'' e ''license'', mas os plugins podem ser reativado em um módulo/subdir com a diretiva CHECK assim:


<code>
<syntaxhighlight lang="text">
CHECK copyright,license
CHECK copyright,license
</code>
</syntaxhighlight>


{{Note|Individual modules can be ignored as well, but this is an EBN administrator duty controlled by component-level ''.krazy'' files within the ''/usr/local/src'' hierarchy. See the [http://wiki.kde.org/English+Breakfast+Network English Breakfast Network wiki] for details.}}
{{Note|Módulos individuais podem ser ignorados também, mas esta é uma função administradora do EBN controlada pelos arquivos ''.krazy'' na hierarquia  ''/usr/local/src''. Veja o [http://wiki.kde.org/English+Breakfast+Network English Breakfast Network wiki] para detalhes.}}


===Krazy Modules===
===Módulos do Krazy===


Risk Ratings:
Índice de risco:


'''Low:'''  Can be fixed by anyone with minimal risk of error.
'''Low:'''  Pode ser resolvido por qualquer pessoa com um risco mínimo de erro.


'''Medium:''' Can be fixed by anyone with appropriate knowledge of C++ features involved, some testing advised.
'''Medium:''' pode ser corrigido por alguém com um conhecimento adequado dos recursos C++ envolvidos, alguns testes recomendados.


'''High:''' Should only be fixed by maintainer/owner of code
'''High:''' Deveria ser corrigido somente pelo mantenedor/proprietário do código.


If you don't understand the code, or you don't understand the fix, then do not fix the code.
Se você não entende o código, ou você não entende a correção, então não
corrija o código.


Fixing apidox and spelling mistakes only requires a compile before submitting. All other fixes should be tested to an appropriate degree, the standard unit tests are useful for this.
Corrigindo apidox e erros de ortografia apenas requer uma compilação antes de
enviar. Todas as outras correções devem ser testados em um nível adequado, os
testes unitários são úteis para isso.


====Module=spelling====
====Module=spelling====


'''Risk from Fixing:''' Low
'''Índice de risco:''' Baixo


Spelling errors in comments and strings should be fixed as they may show up later in API documentation, handbooks, etc. Misspelled strings make the translator's job harder. Please use US English.
Erros de ortografia nos comentários e nas cadeias devem ser corrigidos, pois podem aparecer mais tarde na documentação da API, manuais, etc strings mal escritas tornam o trabalho do tradutor mais difícil. Por favor, utilize Inglês dos EUA.


To exclude all checks in file comment at top of file:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=spelling
// krazy:excludeall=spelling
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no final da linha:
<code>
<syntaxhighlight lang="text">
// krazy:exclude=spelling
// krazy:exclude=spelling
</code>
</syntaxhighlight>


====Module=doublequote_chars====
====Module=doublequote_chars====


'''Risk from Fixing:''' Low
'''Índice de risco:''' Baixo
 
Adicionar caracteres a uma QString é mais rápido se os caracteres são
QChars e não QStrings, ou seja, use aspas simples em vez de aspas dupla em torno de um único caracter.


Adding single characters to a QString is faster if the characters are QChars and not QStrings, i.e. use single quotes instead of double quotes around single characters.


The same holds for arguments to QString::startsWith(), QString::endsWith(), QString::remove(), QString::section(), and QString::split().  
O mesmo vale para os argumentos para QString::startsWith(), QString::endsWith(), QString::remove(), QString::section(), and QString::split().  


Use QString::remove() instead of QString::replace(foo,"")
Use QString::remove() ao invés de QString::replace(foo,"")


Replace
Substitua
<code>
<syntaxhighlight lang="text">
QString path = oldpath + "/" + base;
QString path = oldpath + "/" + base;
</code>
</syntaxhighlight>
with
por
<code>
<syntaxhighlight lang="text">
QString path = oldpath + '/' + base;
QString path = oldpath + '/' + base;
</code>
</syntaxhighlight>


To exclude all checks in file comment at top of file:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=doublequote_chars
// krazy:excludeall=doublequote_chars
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no final da linha:
<code>
<syntaxhighlight lang="text">
// krazy:exclude=doublequote_chars
// krazy:exclude=doublequote_chars
</code>
</syntaxhighlight>


====Module=nullstrassign====
====Module=nullstrassign====


'''Risk from Fixing:''' Low
'''Índice de risco:''' Low


Do not assign QString::null or QString() to a QString. Instead use the .clear() method.
Não atribua QString::null or QString() to a QString. Ao invés disso use o método .clear().


Replace
Substitua
<code>
<syntaxhighlight lang="text">
fileName = QString::null;
fileName = QString::null;
</code>
</syntaxhighlight>
or
por
<code>
<syntaxhighlight lang="text">
fileName = QString();
fileName = QString();
</code>
</syntaxhighlight>
with
com
<code>
<syntaxhighlight lang="text">
fileName.clear();
fileName.clear();
</code>
</syntaxhighlight>


When returning an empty string from a method use "return QString()" When passing an empty string use "QString()".
Quando retornar uma string vazia de um método use "return QString()" quando passar uma string vazia use "QString()".


To exclude all checks in file comment at top of file:
 
<code>
Para excluir todos os checks nos comentários no início do
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=nullstrassign
// krazy:excludeall=nullstrassign
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no final da linha:
<code>
<syntaxhighlight lang="text">
// krazy:exclude=nullstrassign
// krazy:exclude=nullstrassign
</code>
</syntaxhighlight>


====Module=foreach====
====Module=foreach====


'''Message:''' non-const ref iterator
'''Mensagem:''' non-const ref iterator


'''Risk from Fixing:''' Low to Medium
'''Índice de risco:''' Baixo a Médio


When not using POD types (int, double, pointer, ...) you should use const & for your foreach variables. There are two reasons for this: 1) Prevents you from the mistake of writing foreach loops that modify the list, that is 'foreach(Foo f, list) f.a = f.b = f.c = 0;' compiles but does not modify the contents of list 2) Saves a copy constructor call for each of the list elements
Quando não estiver usando tipos POD (int, double, pointer, ...) você deve usar const & para sua foreach variáveis. Há duas razões para isso: 1) Impede que você cometa o erro de escrever loops foreach que modificam a lista, que é 'foreach(Foo f, list) f.a = f.b = f.c = 0;' compila mas não modifica o conteúdo de lista 2) Salva uma cópia da chamada do construtor para cada um dos elementos da lista


Be careful if dealing with pointers? False positive for bool, qlonglong and qulonglong?
Tenha cuidado ao lidar com ponteiros? Falso positivo para bool, qlonglong e qulonglong?


http://tsdgeos.blogspot.com/2008/04/qforeach-is-your-friend.html
http://tsdgeos.blogspot.com/2008/04/qforeach-is-your-friend.html


Replace
Substitua
<code>
<syntaxhighlight lang="text">
foreach(QString str, stringList) {
foreach(QString str, stringList) {
</code>
</syntaxhighlight>
with
por
<code>
<syntaxhighlight lang="text">
foreach(const QString &str, stringList) {
foreach(const QString &str, stringList) {
</code>
</syntaxhighlight>


'''Message:''' values or keys iteration
'''Mensagem:''' values or keys iteration


'''Risk from Fixing:''' Medium to High
'''Índice de risco:''' Medium to High


http://tsdgeos.blogspot.com/2009/04/how-to-make-foreach-loops-that-dont.html
http://tsdgeos.blogspot.com/2009/04/how-to-make-foreach-loops-that-dont.html


To exclude all checks in file comment at top of file:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=foreach
// krazy:excludeall=foreach
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no final da linha:
<code>
<syntaxhighlight lang="text">
// krazy:exclude=foreach
// krazy:exclude=foreach
</code>
</syntaxhighlight>


====Module=strings====
====Module=strings====


'''Message:''' QLatin1String issues
'''Mensagem:''' QLatin1String issues


'''Risk from Fixing:''' Low to Medium
'''Índice de risco:''' Low to Medium


Some QString methods (like startsWith() and endsWith()) are more efficient if they are passed a QLatin1String, avoiding an implicit conversion from const char *.
Alguns métodos QString (como startsWith() e endsWith())são mais eficientes se são passados com QLatin1String, evitando uma conversão implicita de const char *.


Replace
Substitua
<code>
<syntaxhighlight lang="text">
aString.startsWith("init")
aString.startsWith("init")
</code>
</syntaxhighlight>
with
por
<code>
<syntaxhighlight lang="text">
aString.startsWith(QLatin1String("init"))
aString.startsWith(QLatin1String("init"))
</code>
</syntaxhighlight>


A common false positive is with QByteArray which cannot take a QLatin1String.
Um comum false positive é com QByteArray que não poder receber uma QLatin1String.


To exclude all checks in file comment at top of file:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=strings
// krazy:excludeall=strings
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no final da linha:
<code>
<syntaxhighlight lang="text">
// krazy:exclude=strings
// krazy:exclude=strings
</code>
</syntaxhighlight>


====Module=includes====
====Module=includes====


See http://techbase.kde.org/Policies/Library_Code_Policy#Getting_.23includes_right.  
Veja http://techbase.kde.org/Policies/Library_Code_Policy#Getting_.23includes_right.  


'''Message:''' duplicate includes
'''Mensagem:''' includes duplicados


'''Risk from Fixing:''' Low
'''Índice de risco:''' Baixo


The same file has been included twice, remove the second occurrence.
O mesmo arquivo foi incluído duas vezes, remova a segunda ocorrência.


'''Message:''' include own header first
'''Mensagem:''' inclua seu próprio header primeiro


'''Message:''' include own _p header first
'''Mensagem:''' inclua seu próprio _p header primeiro


'''Risk from Fixing:''' Medium
'''Índice de risco:''' Médio


The cpp file should include their own .h and _p.h headers first in the file (but below config.h). Move the includes to the correct position. You may need to adjust includes and forward declarations in other files as a result, the compiler will advise of these.
O arquivo cpp deve incluir as suas próprias .h e os headers _p.h primeiro no arquivo (abaixo do config.h). Mova o include para a posição correta. Você pode precisar ajustar os includes e forward declarations em outros arquivos, como um resultado, o compilador irá informar sobre isso.


'''Message:''' missing or improper include guard in header
'''Mensagem:''' faltando ou include guard imprório no header


'''Risk from Fixing:''' Low
'''Índice de risco:''' Baixo


Either the include guards are missing, or they are not appropriately encoded macro names, e.g. do not include the class name.
Os include guards estão faltando, ou eles não estão com as macro names apropriadamente codificadas, por exemplo, não inclui o class name.


'''Message:'''  
'''Mensagem:'''  


Use <..> to include installed headers.
Use <..> para incluir headers instalados.


'''Message:'''  
'''Message:'''  


To include Qt headers from installed headers.
Para incluir Qt headers de headers instalados.


To exclude all checks in file comment at top of file:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=includes
// krazy:excludeall=includes
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no final da linha:
<code>
<syntaxhighlight lang="text">
// krazy:exclude=includes
// krazy:exclude=includes
</code>
</syntaxhighlight>


====Module=qclasses====
====Module=qclasses====


'''Risk from Fixing:''' Medium
'''Índice de risco:''' Médio


Deprecated Qt classes and classes that have a KDE version shouldn't be used. Also KDE versions of some Qt GUI elements provide a consistent look and feel for the KDE desktop. See http://techbase.kde.org/Policies/API_to_Avoid
Classes do Qt depreciadas e classes que têm uma versão do KDE não devem ser utilizado. Também as versões do KDE de alguns elementos GUI do Qt fornecem uma aparência consistente para o desktop KDE. Veja http://techbase.kde.org/Policies/API_to_Avoid


Some of the K classes don't just add features to the Qt ones and might not even be based on the Qt class. '''Please refer to the API documentation before porting to the K classes.'''
Algumas das classes K não só adicionam recursos para o Qt e podem até não ser baseadas no Qt. '''Por favor, consulte a documentação da API antes de portar para as classes K.'''


To exclude all checks in file comment at top of file:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:excludeall=qclasses
// krazy:excludeall=qclasses
</code>
</syntaxhighlight>


To exclude an individual check comment at the end of the line:
Para excluir todos os checks nos comentários no início do
<code>
arquivo:
<syntaxhighlight lang="text">
// krazy:exclude=qclasses
// krazy:exclude=qclasses
</code>
</syntaxhighlight>


==Compiler Warnings==
==Compiler Warnings==
In addition to the various Krazy tools, you can also get valuable assistance from the warnings that the compiler emits, especially if you enable additional warnings (per the documentation for your compiler), and also if you test with more than one compiler (e.g. if you can test on Linux with both GCC and the Intel compiler; or on Linux with GCC and also on Windows with the Microsoft compiler).
Além das diversas ferramentas Krazy, você também pode obter ajuda preciosa dos avisos que o compilador emite, especialmente se você habilitar os avisos adicionais (por documentação do seu compilador), e também se você testar com mais de um compilador (por exemplo, se você pode testar no Linux com o GCC e tanto o compilador Intel, ou no Linux com o GCC e também no Windows com o compilador Microsoft).

Latest revision as of 16:43, 19 July 2012


Code Checking

Há muitas maneiras de encontrar bugs no código do KDE. Cada vez mais, os desenvolvedores do KDE estão usando ferramentas automatizadas. Você pode usar algumas dessas ferramentas para melhorar o seu próprio código.

O KDE 'Krazy' Checker

Desenvolvedores do KDE tem um simples conjunto de testes que são conhecidos coletivamente como "Krazy". Esses testes foram desenvolvidos originalmente para ser executado como parte de um conjunto de testes em uma máquina conhecida como http://www.englishbreakfastnetwork.org, ou EBN. Você pode ver os resultados da execução de diversos testes noEBN (em http://www.englishbreakfastnetwork.org/krazy/).

Você também pode executar os testes de si mesmo. Para fazer isso, você precisa obter uma cópia do código krazy2/install.txt e instalá-los. Você pode testar um único arquivo (usando o aplicativo krazy2) ou uma árvore inteira, incluindo subdiretórios (usando o aplicativo krazy2all).

Como funciona o Krazy

Os testes Krazy são essencialmente uma forma de análise estática - verifica o código-fonte, mas não como ele é executado.

Krazy existe como um framework formado por diferentes testes, e um conjunto de plugins. Os testes são chamados de krazy2, krazy2all e krazy2ebn. Os testes apenas chamam um ou mais plugins no código apropriado, e formatam os resultados para mostrar.

Nesta fase, a maioria dos testes são escritos em perl, porém um escrito em C + + (usando Qt) e é bem possível adicionar seus próprios testes, ou para modificar um teste - todas o código fonte é fornecido.

Instalando o Krazy

Krazy precisa ser instalado antes de usar. Krazy tem duas formas diferentes de ser instalado - você pode modificar o script krazy2/install.sh e executá-lo, ou siga as instruções no arquivo krazy2/install.txt. Eu recomendo a segunda opção.

Você pode precisar instalar módulos adicionais do perl como XML::LibXML, veja como:

linux-pudb:~/krazy2 # ./install.sh 
MakeMaker FATAL: prerequisites not found.
    Tie::IxHash not installed
    XML::LibXML not installed

 Por favor instale esses primeiros módulos e execute novamente 'perl Makefile.PL'.
linux-pudb:~/krazy2 # perl -mCPAN -e CPAN::shell

Você talvez tenha que responder 25 questões sem utilidade aqui. Neste caso, pressione ENTER 25 vezes. Então você chega aqui:

cpan[1]> install XML::LibXML

O Tie::IxHash eu instalei a partir do repositório da distro (libtie-ixhash-perl) e também o pacote perl-doc é necessário para instalar.

Note
Eu tive um pequeno problema com o plugin que é construída a partir do C + +, porque instalei o plugin no diretório errado. Se estiver faltando o passbyvalue plugin, então talvez seja necessário para movê-lo para o diretório que contém o resto de seus plugins.


Usando o Krazy

Krazy vem com uma página principal muito boa, que lhe dá várias opções e um exemplo de uso. O arquivo é gerado na instalação. Esta é definitivamente uma leitura recomendada!

Como mencionado acima, existem três testes - krazy2, krazy2ebn and krazy2all. Se você está tentando verificar um único arquivo, então krazy2 é a ferramenta certa. Se você está tentando verificar uma árvore (por exemplo, uma aplicação ou todo um módulo versionado), então krazy2all é mais útil. krazy2all não tem uma página, mas você pode obter uma lista das opções com krazy2all --help. Você também pode usar krazy2 para obter informações sobre os vários plugins que podem ajudar você a entender mais sobre krazy2all.

krazy2ebn é a ferramenta que roda sobre o código base do KDE, a EBN e não deve ser executado localmente. No entanto, por favor consulte [[# Controlando Krazy na EBN | Controle Krazy sobre] EBN] abaixo para saber como você pode controlar quais plugins são executados, e que os arquivos são processados pelo programa krazy2ebn na máquina EBN.

Lembre-se que Krazy não altera o seu código - apenas examina. Assim, você pode experimentar de modo seguro executando verificações do Krazy até ter certeza de que você entenda o que está acontecendo.

Da mesma forma, o que significa que Krazy não resolve os problemas - só tenta reportá-los. Entendendo o que está sendo reportado, e como corrigir, é com você. Você também deve lembrar que a política de commit do KDE é de não dar commit em código que você não entende. Assim, corrigir de um erro de ortografia em um comentário é bastante seguro, mas alterar cegamente o código para parar os avisos do Krazy não é uma boa idéia.


Diretivas In-Code

Os plugins do Krazy suportam a seguinte lista de diretivas in-code:

  • //krazy:skip - nenhum teste será executado nesse arquivo.
  • //krazy:excludeall=<name1[,name2,...,nameN]> - os testes do Krazy name1, etc não serão executados nesses arquivos. Múltiplas ocorrência de krazy:excludeall são permitidas.
  • //krazy:exclude=<name1[,name2,...,nameN]> - os testes name1, etc. não serão executados na linha onde essa diretiva for encontrada (veja a next section abaixo para mais informações).

Note que essas diretivas devem ser no estilo dos comentários em C++ que podem ser colocados em qualquer lugar no arquivo (exceto embutido em comentários em C)

Omitindo false-positives

Os testes Krazy são projetados para minimizar os false-positives (isto é, os alertas que não representam problemas reais). No entanto, porque a maioria dos testes são realizados em uma única linha, existem alguns testes que podem produzir um false-positive. Por exemplo, o código que faz algo como:

QString mystring;
mystring += "/";

Será sinalizado pelo verificador doublequote_chars, porque é mais eficiente para adicionar um caracter simples, como mostrado abaixo:

QString mystring;
// note that we are using single quotes
// this is a char, not a char array
mystring += '/';

Esse mesmo verificador irá produzir um falso positivo para o código seguinte:

std::string mystring;
mystring += "/";

Você pode suprimir esses falsos positivos, usando um formato de comentário especial. Para excluir um plugin específico de ser executado em uma linha de código, basta adicionar um comentário em C++ que contenha a string "krazy:exclude=<plugin_name>". Os plugins disponíveis atualmente podem ser encontrados no repository.

Especificamente, para este plugin use "krazy:exclude=doublequote_chars". Por exemplo:

   lenstr = "0" + lenstr;

becomes

   lenstr = "0" + lenstr;  // krazy:exclude=doublequote_chars
Note
Usando o estilo C (/* */) comentários não vão funcionar. Você deve usar o estilo C++ (//) de comentários quando notar testes sendo ignorados.


Controlando Krazy no EBN

Essa seção descreve como usar os arquivos .krazy para controlar a execução do Krazy no EBN. Os arquivos .krazy são usados para dizer ao Krazy ignorar específicos sub-diretórios ou arquivos, ou desativar certos plugins dentro desses módulos e sub-diretórios.

Para ignorar um sub-diretório dentro de um módulo, por exemplo kdepim/kmail, use o diretório IGNORESUBS dentro do arquivo kdepim/.krazy, assim:

IGNORESUBS kmail

Ou você pode ignorar um conjunto de diretórios especificando uma lista separada por vírgulas:

IGNORESUBS kmail,kontact,knode

Para ignorar arquivos ou diretórios dentro de um módulo/subdir, especifique uma expressão regular que coincida com os arquivos para passar juntamente com a directiva SKIP. Por exemplo, para ignorar os diretórioskdepimlibs/kcal/libical, kdepimlibs/kcal/versit, e o arquivo kdepimlibs/kcal/fred.c, use a diretiva dentro do arquivo kdepim/kcal/.krazy:

SKIP /libical/\|/versit/\|fred\.c

Use a diretiva EXCLUDE para desativar uma lista de plugins para todos os arquivos dentro de um módulo/subdir:

EXCLUDE doublequote_chars,qclasses

Para substituir a diretiva EXCLUDE coloque um arquivo .krazy na hierarquia de diretórios, use o comando CHECK. Por exemplo, o nível do componente do arquivo .krazy deve EXCLUDE os plugins copyright e license, mas os plugins podem ser reativado em um módulo/subdir com a diretiva CHECK assim:

CHECK copyright,license
Note
Módulos individuais podem ser ignorados também, mas esta é uma função administradora do EBN controlada pelos arquivos .krazy na hierarquia /usr/local/src. Veja o English Breakfast Network wiki para detalhes.


Módulos do Krazy

Índice de risco:

Low: Pode ser resolvido por qualquer pessoa com um risco mínimo de erro.

Medium: pode ser corrigido por alguém com um conhecimento adequado dos recursos C++ envolvidos, alguns testes recomendados.

High: Deveria ser corrigido somente pelo mantenedor/proprietário do código.

Se você não entende o código, ou você não entende a correção, então não corrija o código.

Corrigindo apidox e erros de ortografia apenas requer uma compilação antes de enviar. Todas as outras correções devem ser testados em um nível adequado, os testes unitários são úteis para isso.

Module=spelling

Índice de risco: Baixo

Erros de ortografia nos comentários e nas cadeias devem ser corrigidos, pois podem aparecer mais tarde na documentação da API, manuais, etc strings mal escritas tornam o trabalho do tradutor mais difícil. Por favor, utilize Inglês dos EUA.

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=spelling

Para excluir todos os checks nos comentários no final da linha:

// krazy:exclude=spelling

Module=doublequote_chars

Índice de risco: Baixo

Adicionar caracteres a uma QString é mais rápido se os caracteres são QChars e não QStrings, ou seja, use aspas simples em vez de aspas dupla em torno de um único caracter.


O mesmo vale para os argumentos para QString::startsWith(), QString::endsWith(), QString::remove(), QString::section(), and QString::split().

Use QString::remove() ao invés de QString::replace(foo,"")

Substitua

QString path = oldpath + "/" + base;

por

QString path = oldpath + '/' + base;

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=doublequote_chars

Para excluir todos os checks nos comentários no final da linha:

// krazy:exclude=doublequote_chars

Module=nullstrassign

Índice de risco: Low

Não atribua QString::null or QString() to a QString. Ao invés disso use o método .clear().

Substitua

fileName = QString::null;

por

fileName = QString();

com

fileName.clear();

Quando retornar uma string vazia de um método use "return QString()" quando passar uma string vazia use "QString()".


Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=nullstrassign

Para excluir todos os checks nos comentários no final da linha:

// krazy:exclude=nullstrassign

Module=foreach

Mensagem: non-const ref iterator

Índice de risco: Baixo a Médio

Quando não estiver usando tipos POD (int, double, pointer, ...) você deve usar const & para sua foreach variáveis. Há duas razões para isso: 1) Impede que você cometa o erro de escrever loops foreach que modificam a lista, que é 'foreach(Foo f, list) f.a = f.b = f.c = 0;' compila mas não modifica o conteúdo de lista 2) Salva uma cópia da chamada do construtor para cada um dos elementos da lista

Tenha cuidado ao lidar com ponteiros? Falso positivo para bool, qlonglong e qulonglong?

http://tsdgeos.blogspot.com/2008/04/qforeach-is-your-friend.html

Substitua

foreach(QString str, stringList) {

por

foreach(const QString &str, stringList) {

Mensagem: values or keys iteration

Índice de risco: Medium to High

http://tsdgeos.blogspot.com/2009/04/how-to-make-foreach-loops-that-dont.html

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=foreach

Para excluir todos os checks nos comentários no final da linha:

// krazy:exclude=foreach

Module=strings

Mensagem: QLatin1String issues

Índice de risco: Low to Medium

Alguns métodos QString (como startsWith() e endsWith())são mais eficientes se são passados com QLatin1String, evitando uma conversão implicita de const char *.

Substitua

aString.startsWith("init")

por

aString.startsWith(QLatin1String("init"))

Um comum false positive é com QByteArray que não poder receber uma QLatin1String.

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=strings

Para excluir todos os checks nos comentários no final da linha:

// krazy:exclude=strings

Module=includes

Veja http://techbase.kde.org/Policies/Library_Code_Policy#Getting_.23includes_right.

Mensagem: includes duplicados

Índice de risco: Baixo

O mesmo arquivo foi incluído duas vezes, remova a segunda ocorrência.

Mensagem: inclua seu próprio header primeiro

Mensagem: inclua seu próprio _p header primeiro

Índice de risco: Médio

O arquivo cpp deve incluir as suas próprias .h e os headers _p.h primeiro no arquivo (abaixo do config.h). Mova o include para a posição correta. Você pode precisar ajustar os includes e forward declarations em outros arquivos, como um resultado, o compilador irá informar sobre isso.

Mensagem: faltando ou include guard imprório no header

Índice de risco: Baixo

Os include guards estão faltando, ou eles não estão com as macro names apropriadamente codificadas, por exemplo, não inclui o class name.

Mensagem:

Use <..> para incluir headers instalados.

Message:

Para incluir Qt headers de headers instalados.

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=includes

Para excluir todos os checks nos comentários no final da linha:

// krazy:exclude=includes

Module=qclasses

Índice de risco: Médio

Classes do Qt depreciadas e classes que têm uma versão do KDE não devem ser utilizado. Também as versões do KDE de alguns elementos GUI do Qt fornecem uma aparência consistente para o desktop KDE. Veja http://techbase.kde.org/Policies/API_to_Avoid

Algumas das classes K não só adicionam recursos para o Qt e podem até não ser baseadas no Qt. Por favor, consulte a documentação da API antes de portar para as classes K.

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:excludeall=qclasses

Para excluir todos os checks nos comentários no início do arquivo:

// krazy:exclude=qclasses

Compiler Warnings

Além das diversas ferramentas Krazy, você também pode obter ajuda preciosa dos avisos que o compilador emite, especialmente se você habilitar os avisos adicionais (por documentação do seu compilador), e também se você testar com mais de um compilador (por exemplo, se você pode testar no Linux com o GCC e tanto o compilador Intel, ou no Linux com o GCC e também no Windows com o compilador Microsoft).