我正在查看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';
Run Code Online (Sandbox Code Playgroud)
为什么你们会i++;
然后i--;
紧跟其后?i
是0
,则i++
轮流i
到1
。在那之后,i--
变成i
到0
。
链接到原始源代码。搜索:
i++;
i--;
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这是干什么用的?
dbu*_*ush 155
这是一个错误。这些行一起导致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';
Run Code Online (Sandbox Code Playgroud)
所以这是作者在发布初始 nmap 源代码和初始签入到 SVN 之间发现并修复的问题。
JL2*_*210 42
这毫无用处。它绝对没有任何作用。
如果我推测它可能是开发过程中使用的一些调试代码的残余。
我猜想其中一个i++
或i--
是在一个更改中引入的,而另一个是在另一个更改中引入的。
但是,我无法找到介绍点,因为在最初的源代码发布和第一个 SVN 修订版之间没有修订历史记录。
小智 9
对于非优化编译器,或识别硬件副作用的编译器,i++;i-- 序列会导致 i 从内存中读取,然后重新写入,无论通过 for 循环和嵌套 if 的路径如何。
在并行处理中,有时会采用编译器技巧来确保代码序列使用其自己的变量本地副本而不是全局副本。
由于示例是代码片段,因此无法确定使用的编译器、预期的操作系统/硬件,也无法确定这是否在可以作为独立线程执行的代码序列/函数中。
在更简单的系统中,我临时强制更改变量以在调试环境中使用陷阱功能。如果是这样,作者可能在开发完成时忘记删除代码。