C 两段代码,一段有效,一段无效,为什么?
我有两位代码,我认为它们的工作原理完全相同:C 两段代码,一段有效,一段无效,为什么?,c,parsing,segmentation-fault,qemu,C,Parsing,Segmentation Fault,Qemu,我有两位代码,我认为它们的工作原理完全相同: if (ntohs(tcp_hdr->tcp_dport)==80) { char * parser = strtok(string,";;"); while (parser != NULL){ char parvar[100]; strcpy(parvar, parser); if(parvar[0] == 'H' &&am
if (ntohs(tcp_hdr->tcp_dport)==80) {
char * parser = strtok(string,";;");
while (parser != NULL){
char parvar[100];
strcpy(parvar, parser);
if(parvar[0] == 'H' && parvar[1] == 'o' && parvar[2] == 's' && parvar[3] == 't') {
char * substr = extract(parvar, 6, strlen(parvar));
visited_hosts[hosts_counter] = substr;
hosts_counter++;
}
parser = strtok(NULL, ";;");
}
bytes_sent += ((ip_hdr->ip_ttl)-40);
}
及
我有一个while(1)监听器,第一段代码工作正常,但第二段代码在完成任务后退出循环,并出现分段错误。我不能使用gdb,因为我正在使用QEMU测试我的解决方案。你们知道有什么问题吗?或者我还能用什么来调试QEMU中的c代码呢?恭喜你们,你们刚刚掉进了固定限制陷阱: 在堆栈上分配一个100字节的数组,然后将未知大小的字符串复制到其中(使用
strcpy()
)。现在,当解析器是一个长度超过100字节的字符串时,strcpy()
将继续写入数组末尾,覆盖堆栈上的重要数据,包括函数返回地址。这就是当函数试图返回时程序崩溃的原因——它试图跳转到一个不存在的地址
我的建议是:不惜一切代价避免固定大小的缓冲区。不惜一切代价避免任何固定的限制。唯一的例外是,当你能够证明未来的使用将永远无法超过限制。因为,每当你使用一个固定的限制,我可以向你保证,总有一天它会被超过并咬到你。找到这样一个bug来修复它比第一次做对要昂贵得多。当你制作“strcpy(parvar,parser);”时,parser在两个选项中的值是否相同?
if (ntohs(tcp_hdr->tcp_sport)==80) {
char * parser = strtok(string,";;");
while (parser != NULL){
char parvar[100];
strcpy(parvar, parser);
if(parvar[0] == 'L' && parvar[1] == 'o' && parvar[2] == 'c' && parvar[3] == 'a') {
char * substr = extract(parvar, 10, strlen(parvar));
visited_pages[pages_counter] = substr;
pages_counter++;
}
parser = strtok(NULL, ";;");
}
bytes_received += ((ip_hdr->ip_ttl)-40);
}