Eu estava olhando o código fonte do nmap lançado em 1997 e notei essa seção de código que me parece um pouco estranha:
int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++; /* <<<<<< */
i--; /* <<<<<< */
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';
Por que você teria i++;
e i--;
depois um do outro? i
é 0
, então i++
vira i
para 1
. Depois disso, i--
vira i
para 0
.
Link para o código fonte original. Procurar por:
i++;
i--;
Alguém pode explicar para que serve isso?
-O
isso, ele realmente otimiza essas instruções.Respostas:
Isso foi um bug. Essas linhas juntas resultam
i
inalteradas, portanto não deveriam estar lá.O artigo vinculado que introduziu o nmap foi publicado em 1 de setembro de 1997. Se você olhar o repositório SVN para o nmap em https://svn.nmap.org/nmap , a revisão inicial registrada em 10 de fevereiro de 1998 não possui as seguintes linhas:
Portanto, isso é algo que o autor encontrou e corrigiu entre publicar o código-fonte inicial do nmap e o check-in inicial no SVN.
fonte
<pre>
tags no artigo; O inspetor do Chrome revela como isso leva a algum documento confundido durante a construção do DOM;)i
não fosse um int, mas alguma classe sofisticada com sobrecargas de operador, é possível (embora improvável e geralmente um sinal de práticas inadequadas de codificação) que isso possa ter alguns efeitos colaterais. (Somente se aplica se for C ++, é claro.)É inútil. Não faz absolutamente nada.
Se eu fosse especular, provavelmente são os restos de algum código de depuração usado durante o desenvolvimento.
Eu estou supondo que um
i++
oui--
foi introduzido em uma mudança e o outro foi introduzido em outra.Não tenho como encontrar o ponto de introdução, no entanto, porque não havia histórico de revisão entre o lançamento inicial da fonte e a primeira revisão do SVN.
fonte
Para um compilador que não otimiza ou que reconhece efeitos colaterais de hardware, o i ++; A sequência i-- faria com que eu fosse lido da memória e depois reescrito, independentemente do caminho percorrido pelo loop for e aninhado se.
No processamento paralelo, algumas vezes são executados hackers do compilador para garantir que uma sequência de código use suas próprias cópias locais de variáveis em vez de cópias globais.
Como o exemplo é um trecho de código, não é possível determinar o compilador usado, o sistema operacional / hardware esperado, nem se isso está em uma sequência / função de código que pode ser executada como um encadeamento independente.
Em sistemas mais simples, forcei temporariamente alterações nas variáveis para exercitar o recurso de interceptação em um ambiente de depuração. Se for esse o caso, o autor pode ter esquecido de remover o código quando o desenvolvimento foi concluído.
fonte
i
como variável local é mostrada no código acima e não há como acessá-la por outro encadeamento no ponto em que asi++; i--
linhas estão.i
é forçado a não ser volátil. No entanto, eu não lidei com o encadeamento em C ou C ++, por isso não faço ideia de como isso poderia ser tratado como volátil e comoi++; i--
suprimir isso.Vou sugerir que você verifique apenas o código atualizado. Se você usar (i = 2 + 1) logo depois (i-1), isso não fará sentido. O valor de i permanece inalterado. Você pode experimentá-lo usando qualquer compilador c ou c ++. ou mesmo em qualquer outro idioma, é o mesmo. Execute o código no compilador para verificar se estou certo ou errado e me informe se estou dando uma resposta errada.
fonte