我正在运行PARSEC x264基准,它运行得很好,直到关闭时才崩溃。不幸的是,该套件似乎无人维护或维护率较低--这个问题(崩溃,而非具体细节)近一年前就在邮件列表上发布过,但没有回复。
我已经将问题隔离到一个特定函数的一部分(见下文),用printf进行了老式调试。
void x264_cqm_delete( x264_t *h )
{
int i, j;
printf("IN BAD CODE\n");
for( i = 0; i < 6; i++ )
{
for( j = 0; j < i; j++ )
if( h->quant4_mf[i] == h->quant4_mf[j] )
break;
if( j == i )
{
printf("DELETE CODE with i = %i and j = %i\n", i, j);
x264_free( h-> quant4_mf[i] );
x264_free( h->dequant4_mf[i] );
x264_free( h->unquant4_mf[i] );
}
for( j = 0; j < i; j++ )
if( h->quant4_bias[i] == h->quant4_bias[j] )
break;
if( j == i )
x264_free( h->quant4_bias[i] );
}
}
这就产生了输出...
IN BAD CODE
DELETE CODE with i = 0 and j = 0
DELETE CODE with i = 4 and j = 4
DELETE CODE with i = 5 and j = 4
到底是怎么回事?
从检查x264库本身的规范代码来看,似乎很明显是代码坏了,我看到这些问题的原因是代码在糟蹋堆。
其实外循环的极限应该是4--它应该与各种数组名称中使用的数字相匹配--这是x264库本身使用的模式--而quant4_mf数组的第一维只有4个元素。以这种方式修补代码,可以看到编译后的二进制运行没有问题。