引言

最近需要写一个CoAP协议的服务端,使用C语言,所以就用DeepSeek、豆包、Kimi生成了基于libcoap的代码,不管哪个工具都有错误,花了一个下午才把程序调试好,记录一下。三个大模型都不能生成100%正确代码。我厂商用一个模型去自动修复另一个模型的错误代码,也失败了,在修复时他们会偏重代码的规范性检查,而不是代码中真正的错误。这里就不比较哪个大模型更好一些了。

问题

结构体中字符串溢出

这个问题在三个大模型中都有,请看下面的代码:

/* 车位资源结构体 */
typedef struct {
    int id;
    char status[10];  // "free", "occupied", "maintenance"
} parking_slot_t;

/* 全局车位资源 */
parking_slot_t slots[] = {
    {1, "free"}, {2, "occupied"}, {3, "free"}, {4, "maintenance"}
};

这里的status长度设置为10,但是字符串“maintenance”已经超过10个字符了,所以会导致溢出,好在编译器在初始化结构体的地方给出了警告。如果没有初始化结构体,可能不容易发现这个错误。这里的另外一个经验是所有的警告都要当做错误去检查一遍

回调函数参数个数不对

下面的代码中,回调函数的参数多了一个token,删除掉就对了。这个地方也是有warning,register那里只是一个函数指针,编译器是可以生成代码的,但是由于参数错误,如果运行肯定会导致参数错误,严重的话会崩溃,因为牵扯指针操作。再次提醒我们:所有的警告都要当做错误去检查一遍

void handle_parking_slot(coap_resource_t *resource, coap_session_t *session,
                         const coap_pdu_t *request, const coap_binary_t *token,
                         coap_string_t *query, coap_pdu_t *response) {
…… 
}


……

        coap_register_request_handler(resource, COAP_REQUEST_GET, handle_parking_slot);

coap_get_data函数的用法错误

coap_get_data函数的作用是从CoAP PDU中取得载荷的,按理说是个常用函数,但是三个大模型都不能正确处理这个函数,不是参数少,就是参数多,比如DeepSeek生成的代码是这样的:

    size_t len;
    const uint8_t *data = coap_get_data(request, &len);
    if (!data || len == 0) {
        coap_pdu_set_code(response, COAP_RESPONSE_CODE(400));
        return;
    }

正确的代码应该是

    size_t len;
    const uint8_t *data;
    uint8_t ret = coap_get_data(request, &len, &data);
    if (!ret || len == 0) {
        coap_pdu_set_code(response, COAP_RESPONSE_CODE(400));
        return;
    }

 这个错误倒是比较容易发现,因为编译器报告了错误。 

coap_add_option参数个数错误

DeepSeek生成的代码如下:

    coap_add_option(response, COAP_OPTION_CONTENT_FORMAT,
                    coap_encode_var_safe(NULL, 0, COAP_MEDIATYPE_APPLICATION_LINK_FORMAT));

coap_add_option有4个参数,而生成的代码是3个参数,显然编译器会报告错误。

size_t 	coap_add_option (coap_pdu_t *pdu, uint16_t type, size_t len, const uint8_t *data)

coap_encode_var_safe的用法也有小问题。coap_encode_var_safe是libcoap新加的函数,用以替代原来的coap_decode_var_bytes,以提高代码的安全性,它的定义如下:

unsigned int coap_encode_var_safe	(	uint8_t * 	buf,
size_t 	length,
unsigned int 	value 
)	

 修改的代码如下:

    uint8_t buf[3];
    coap_add_option(response, COAP_OPTION_CONTENT_FORMAT,
                    coap_encode_var_safe(buf, sizeof(buf), COAP_MEDIATYPE_APPLICATION_LINK_FORMAT), buf);

出现了libcoap没有的函数

这个问题主要出现在豆包,它出现了明显的幻觉,生成了诸如coap_context_get_resources、coap_session_get_context这样的函数,我让Kimi和DeepSeek修复代码,他们都能改掉这部分。

结语

总的来看,生成的CoAP代码没有MQTT代码质量高,主要的原因可能还是CoAP没有MQTT用的多,另外libcoap的API还在演进中,不同版本代码的学习可能也导致大模型有点混乱。对大模型生成的代码一定要认真检查,否则运行时不知道要出啥事。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐