千里之堤毁于蚁穴 qwen coder和kimi编写代码的雷同错误分析

前文测试发现,相对其他被测试的大模型,qwen coder和kimi编写的代码底子还是不错的,至少正确解析出了字符串。那为什么数值一个也没解析出来?

查看qwen coder这段代码

            char *c_close = strstr(c_end, "</c>");
            if (!c_close) break;
            
            char *content = NULL;
            char *t_attr = extract_attr_value(c_start, "t=\"");
            
            if (t_attr && strcmp(t_attr, "inlineStr") == 0) {
                content = extract_tag_content(c_end, "t");
            } else {
                content = extract_tag_content(c_end, "v");
            }

只要找到inlineStr,就只找t标签不找v标签,为什么每列都能找到inlineStr,因为越界查找了,没有限定找的范围是当前列。修改也简单, 給提取函数增加一个区间结束位置参数,调用时传入列结束位置就可以了,

char* extract_tag_content(char *start, const char *tag_name, char *close) {
    static char content[BUFFER_SIZE];
    char open_tag[64];
    char close_tag[64];
    
    snprintf(open_tag, sizeof(open_tag), "<%s>", tag_name);
    snprintf(close_tag, sizeof(close_tag), "</%s>", tag_name);
    
    char *content_start = strstr(start, open_tag);
    if (!content_start || content_start>close) return NULL;
    
    content_start += strlen(open_tag);
    char *content_end = strstr(content_start, close_tag);
    if (!content_end|| content_start>close) return NULL;
    
    int len = content_end - content_start;
    if (len >= BUFFER_SIZE) len = BUFFER_SIZE - 1;
    
    strncpy(content, content_start, len);
    content[len] = '\0';
    return content;
}

....

            content = extract_tag_content(c_end, "v", c_close);
            if (content==NULL && t_attr && strcmp(t_attr, "inlineStr") == 0) {
                content = extract_tag_content(c_end, "t", c_close);
            } 

修改以后,qwen coder的代码输出就正确了

./qw sheet13.xml
1,1,15519,785,1,17.00,24386.67,0.04,0.02,N,O,35137.0,35107.0,35146.0,DELIVER IN PERSON,TRUCK,to beans x-ray carefull

再看kimi代码,相同的出错现象后面是同样的错因,这次让他自己改,也基本改对了,为什么说基本,因为数值列没取到

./kimi sheet13.xml
1,,,,,,,,,N,O,,,,DELIVER IN PERSON,TRUCK,to beans x-ray carefull

原因是没改全, kimi判断inlineStr是否找到用了个技巧把字符指针转成整数,但是忽略了找的范围是当前列,把原句注释掉改成下面的,也正确了

            //int is_inline = !!strstr(c, inlineStr);
            int is_inline = 0;
            char * cin=strstr(c, inlineStr);
            if(cin!=NULL && cin<c_next)
                is_inline = 1;

输出如下

./kimi sheet13.xml
1,1,15519,785,1,17.00,24386.67,0.04,0.02,N,O,35137.0,35107.0,35146.0,DELIVER IN PERSON,TRUCK,to beans x-ray carefull

再比较效率,qwen coder的代码效率较高,kimi的就呵呵了。

 time ./qw lineitem/xl/worksheets/sheet1.xml >tmp.csv

real    0m16.247s
user    0m1.819s
sys     0m0.834s
time ./kimi lineitem/xl/worksheets/sheet1.xml >tmp2.csv
^C

real    2m20.696s

结合代码量kimi 118行,3,414 字节,而qwen coder 200行,6,198 字节。所以高效的代码还是需要相对复杂的处理的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值