NEC2最初是用Fortran编写的,并从原始Fortran进行了两个不同的C端口(xnec2c和necpp)。
变量和函数名称相似(通常完全相同)。然而,作者选择了不同的数据结构来存储全局值。
是否有一种方法可以对这两个实现进行差异比较,以查看是否存在实际差异,而不仅仅是命名约定上的差异?
似乎可能是可行的,重构工具如Coccinelle具有一定的结构意识并理解数据类型。
如果是这样,那么通过这样的静态分析可以检测到由于作者错误导致的一个程序或另一个程序中的错误。然后,人们可以将C代码实现与原始Fortran进行比较,以确定哪一个是正确的,或者如果在语法上不同的表示是计算等效的。请注意,这是一个静态分析,我们只想知道代码结构(分支和表达式,因此数据类型)是否相同。
例如,这两个示例计算相同的内容,但变量icon1
和ind1
的存储不同:
if( -icon1[iprx] != jx )
ind1=2;
else
{
xi= fabsl( cabj* cab[iprx]+ sabj* sab[iprx]+ salpj* salp[iprx]);
if( (xi < 0.999999) || (fabsl(bi[iprx]/b-1.) > 1.e-6) )
ind1=2;
else
ind1=0;
}
比较
if( -data.icon1[iprx] != jx )
dataj.ind1=2;
else
{
xi= fabs( dataj.cabj* data.cab[iprx]+ dataj.sabj*
data.sab[iprx]+ dataj.salpj* data.salp[iprx]);
if( (xi < 0.999999) ||
(fabs(data.bi[iprx]/dataj.b-1.0) > 1.0e-6) )
dataj.ind1=2;
else
dataj.ind1=0;
} /* if( -data.icon1[iprx] != jx ) */