xcode中的单元测试:不一致的构建结果

时间:2011-03-22 05:12:41

标签: iphone objective-c

Test Case '-[TestParse testParsing]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415:  3256 Segmentation fault  "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms /iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest'    
exited abnormally with code 139 (it may have crashed).

当我随机构建测试用例时(有时它构建成功,有时会抛出seg错误),我得到了这个seg错误消息。我不确定如何解决这个错误。 我在这里测试的只是我用类级方法写了一个类名Parse。在测试用例中我只是称之为

var = [Parse methodName:filepath]; 

方法就像这样

NSMutableDictionary *tempBox = [[NSMutableDictionary alloc] init];
FILE *fd = fopen([filePath UTF8String], "r");
if(!fd){
    NSLog(@"fail to open file\n");
}
char buf[4096], *ptr;
char name[512], description[4096];
int  isNewInfo = 2, description_continue = 0;

//  for (line = 0; line < [args objectAtIndex:1]; line++) {
//      fgets(buf, 4096, fd);
//  }

while(fgets(buf, sizeof(buf), fd) != NULL){
    if(strcmp(buf, "\n") == 0){
        isNewInfo -= 1;
        if(isNewInfo == 0){
            isNewInfo = 2;
            description_continue = 0;
            description[strlen(description)-1] = '\0';
            [self saveDrinkandResetBuf:name
                    detail:description box:tempBox];
            if(name[0] != 0 || description[0] != 0){
                NSLog(@"fail to reset..."); 
            }

        }
    }
    if(description_continue){
        strcat(description, buf);
        continue;
    }
    if((ptr = strstr(buf, "Drink Name: "))){
        memcpy(name, buf+12, strlen(buf));
        name[strlen(name)] = '\0';
        continue;
    }
    if((ptr = strstr(buf, "Description: "))){
        memcpy(description, buf+13, strlen(buf));
        description_continue = 1;
        continue;
    }
}
fclose(fd);
NSLog(@"finish parsing section\n");
//[tempBox release];
return tempBox;

不确定这里发生了什么..

1 个答案:

答案 0 :(得分:2)

我想,问题在于阵列管理。

在C中,如果数组在函数中声明(并且未声明为全局或静态数组),则其元素的值未定义。因此,char description[4096]充满了任何值。没人说'\ 0'会在那里。

未定义非空终止字符串的strlen(...)结果。它可能导致内存访问冲突,因为它会一直计数,直到它到达第一个值为0的内存字节。

此外,当您致电description[strlen(description)-1]时,strlen可以返回0(想象第一个值,最初存储在'\ 0',并且您的文件以两个空行启动[以达到此目的]代码行]) - 所以数组索引将是-1 ...