1997 년에 출시 된 nmap 의 소스 코드를 살펴 보니이 코드 섹션이 조금 이상해 보입니다.
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';
왜 당신은 할 것이다 i++;
다음 i--;
바로 서로 후? i
이며 0
, 다음 i++
회전 i
에 1
. 그 후, i--
회전 i
에 0
.
원본 소스 코드에 연결하십시오. 검색 :
i++;
i--;
누구나 이것이 무엇인지 설명 할 수 있습니까?
답변
이것은 버그였습니다. 이 줄들은 함께i
바뀌지 않으므로 가 없었습니다.
nmap을 소개 한 링크 된 기사는 1997 년 9 월 1 일에 게시되었습니다. https://svn.nmap.org/nmap 에서 nmap의 SVN 저장소를 보면 1998 년 2 월 10 일에 체크인 한 초기 개정판에 해당 행이 없습니다.
int i=0, j=0,start,end;
char *expr = strdup(origexpr);
char *mem = expr;
ports = safe_malloc(65536 * sizeof(short));
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';
따라서 이것은 초기 nmap 소스 코드와 초기 체크인을 SVN에 게시하는 사이에 저자가 찾아서 고친 것입니다.
답변
그건 소용 없어. 절대 아무것도하지 않습니다.
내가 추측한다면 아마도 개발 중에 사용 된 디버깅 코드의 일부 일 것입니다.
하나 i++
또는 i--
하나의 변경에 도입되었고 다른 하나는 다른 변경에 도입 되었다고 추측합니다 .
초기 소스 릴리스와 첫 번째 SVN 개정 사이에 개정 내역이 없기 때문에 소개 지점을 찾을 방법이 없습니다.
답변
비 최적화 컴파일러 또는 하드웨어 부작용을 인식하는 컴파일러의 경우 i ++; i– 시퀀스는 for 루프를 통해 가져오고 중첩 된 if 경로에 관계없이 메모리에서 i를 읽은 다음 다시 쓰도록합니다.
병렬 처리에서는 코드 시퀀스가 전역 복사본이 아닌 자체 로컬 변수 복사본을 사용하도록 컴파일러 해킹이 수행되기도합니다.
예제는 코드 스 니펫이므로 사용 된 컴파일러, 예상 운영 체제 / 하드웨어 또는 독립 스레드로 실행할 수있는 코드 시퀀스 / 기능인지 여부를 확인할 수 없습니다.
더 간단한 시스템에서는 디버깅 환경에서 트랩 기능을 사용하도록 변수 변경을 일시적으로 강제했습니다. 이 경우 개발이 완료되었을 때 작성자가 코드를 제거하는 것을 잊었을 수 있습니다.
답변
업데이트 된 코드 만 확인하시기 바랍니다. (i-1) 바로 다음에 (i = 2 + 1)을 사용하면 의미가 없습니다. i의 값은 변경되지 않습니다. c 또는 c ++ 컴파일러를 사용하여 시도 할 수 있습니다. 또는 다른 언어로도 동일합니다. 컴파일러에서 코드를 실행하여 내가 틀렸거나 옳은지 확인하고 틀린 대답을하는지 알려주십시오.
답변
