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;
不确定这里发生了什么..
答案 0 :(得分:2)
我想,问题在于阵列管理。
在C中,如果数组在函数中声明(并且未声明为全局或静态数组),则其元素的值未定义。因此,char description[4096]
充满了任何值。没人说'\ 0'会在那里。
未定义非空终止字符串的strlen(...)
结果。它可能导致内存访问冲突,因为它会一直计数,直到它到达第一个值为0的内存字节。
此外,当您致电description[strlen(description)-1]
时,strlen
可以返回0(想象第一个值,最初存储在'\ 0',并且您的文件以两个空行启动[以达到此目的]代码行]) - 所以数组索引将是-1 ...