Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tb_buffer_memncpyp会错误地改变目标缓冲区的大小 #208

Open
duyanning opened this issue Mar 2, 2023 · 4 comments
Open

tb_buffer_memncpyp会错误地改变目标缓冲区的大小 #208

duyanning opened this issue Mar 2, 2023 · 4 comments

Comments

@duyanning
Copy link
Contributor

    tb_buffer_t b;
    tb_buffer_init(&b);

    tb_buffer_memncpy(&b, (tb_byte_t const*)"abcde", 6); // data[0-5]
    tb_trace_i("%s", tb_buffer_data(&b));

    printf("size: %ld\n", tb_buffer_size(&b));
    printf("maxn: %ld\n", tb_buffer_maxn(&b));
    printf("data[%ld]=%d\n", tb_buffer_size(&b), *((char*)tb_buffer_data(&b)+tb_buffer_size(&b)));
    printf("data[%ld]=%d\n", tb_buffer_size(&b)+1, *((char*)tb_buffer_data(&b)+tb_buffer_size(&b)+1));
    printf("data[%ld]=%d\n", tb_buffer_size(&b)+2, *((char*)tb_buffer_data(&b)+tb_buffer_size(&b)+2));

    tb_buffer_memncpyp(&b, 1, "XY", 2); // 用XY覆盖目标缓冲区中两个字节,目标缓冲区长度不该有变化
    tb_trace_i("%s", tb_buffer_data(&b));
    printf("size: %ld\n", tb_buffer_size(&b));
    printf("maxn: %ld\n", tb_buffer_maxn(&b));

    tb_buffer_exit(&b);

上述代码会产生如下输出:

abcde
size: 6
maxn: 32
data[6]=0
data[7]=0
data[8]=-24
aXYde
size: 3 // 此处存在问题,size应该保持6不变。只是用XY覆盖了bc而已。
maxn: 32
@waruqi
Copy link
Member

waruqi commented Mar 3, 2023

是这样的,命名上稍微有点歧义,它不是常规的 memcpy ,目前是会 copy 完,自动收缩大小的。。其实应该算是 copy + init 。。复制过去,重新赋值整个 buffer

就比如 buffer 现在 size 100 多了。。再去这么 copy 下。也是整个完整重新赋值成 "abcde", size 变为 6 。。

tb_buffer_memncpy(&b, (tb_byte_t const*)"abcde", 6);

tb_buffer_ 接口主要用于 buffer 的自动大小控制,自动分配,自动收缩。。而灵活 memcpy/memmov 不是主要目的,想要精细的 memcpy 。。可以自己 resize 后,走原生 tb_memcpy 去做

@duyanning
Copy link
Contributor Author

命名上稍微有点歧义,它不是常规的 memcpy ,目前是会 copy 完,自动收缩大小的。。其实应该算是 copy + init 。。复制过去,重新赋值整个 buffer

我前几日对 tb_buffer_memnsetp 也提了类似bug报告:#207
今日听你这么一讲,我感觉那天那个bug其实不算bug。可能你被我一催,修复得有点草率了,忘了保持一致性。
我明显能感觉得到 tb_buffer_memncpyp 跟 tb_buffer_memnsetp 是一个风格的。
建议保持原来的行为一致性。
或许可以分成两组接口:一组有init效果,一组没有。

@waruqi
Copy link
Member

waruqi commented Mar 3, 2023

今日听你这么一讲,我感觉那天那个bug其实不算bug。可能你被我一催,修复得有点草率了,忘了保持一致性。

那个是 bug,tb_buffer_memsetp(&b, 4, 65); 并没有设置 set 多少 size,默认就是从 pos 4 位置填满后续的 size,也就是 4-5

hellAA

但是,写超了,不应该去 增长 size 变成 hellAAAAAA

@waruqi
Copy link
Member

waruqi commented Mar 3, 2023

或许可以分成两组接口:一组有init效果,一组没有。

暂时没啥必要,如果用 memcpy,直接 tb_memcpy 就行了,tb_buffer 并没有简化多少,它主要是用来维护 buffer size 分配的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants