我已经尝试消除诸如解引用空指针等段错误的常见原因,但我束手无策。在我的测试机上,此错误不会出现在调试模式下,但在我生产机器的发布编译中会出现。两者都设置为/O0以排除这种可能性。当我注释掉字符串赋值时,段错误消失了,现在我只需要理解发生了什么,以便我可以修复它。
可能有更明显的东西,但进一步的复杂性是,此代码是由内核模式应用程序调用的,而我从供应商收到的关于编写系统安全代码的唯一指导是“每个需要操作系统任何内容或必须等待任何内容来自操作系统的函数将无法工作”(逐字翻译)。
可能有更明显的东西,但进一步的复杂性是,此代码是由内核模式应用程序调用的,而我从供应商收到的关于编写系统安全代码的唯一指导是“每个需要操作系统任何内容或必须等待任何内容来自操作系统的函数将无法工作”(逐字翻译)。
union {
REAL_T real[8];
char byte[64];
} fileName;
void transferFilenames () {
string tempname;
// This is from an api I must use, it retrieves values from NVRAM on
// an accessory board. Specifically it will return 8 REAL_T values
// and store them starting at &filename.real[0], inp/outpArray are
// globals defined elsewhere.
inpArray.I7_ARRAY.INDEX = 2903;
inpArray.I7_ARRAY.LEN = 8;
inpArray.I7_ARRAY.Z_PAR_PTR = &fileName.real[0];
b_array ( READ_CYCLE_PARAMS, &status, &inpArray, &outpArray );
// if status != 0, there was an error
if ( status == 0 ) {
// there is no guarantee of being null terminated
fileName.byte[63] = 0;
/* This test code didn't fix the problem
int i;
char myStr[64];
for ( i = 0; i < 64; i++ )
myStr[i] = fileName.byte[i];
if ( myStr[0] != '\0' )
string mystring( myStr ); // seg fault
*/
tempname.assign( fileName.byte ); // Throws seg fault
// tempname.assign( &fileName.byte[0] ); // try to be more explicit
// controlBlock is a global class defined elsewhere
controlBlock->setFileName ( tempname, ISINPUT);
} else {
controlBlock->setFileName( "BAD", ISINPUT );
}
return;
}
当我过载控制块以直接使用char* controlBlock->setFileName( &fileName.byte[0] )
,并完全删除字符串赋值时,分段错误消失了。 过载的所有内容都只是将char*分配给本地字符串并调用常规方法。
我在幕后错过了什么?
malloc(size_t) {kill(0, SEGBUS);}
的路线实现malloc
。 - David Hammen