9 Star 2 Fork 35

openEuler / libarchive-rust

 / 详情

【代码检视】未使用已经写好的结构体

已完成
任务
创建于  
2022-12-12 20:32

代码文件:archive_read_support_format_mtree.rs
问题代码函数:parse_digest
未使用已经写好的结构体
重构前

	switch (type) {
	case ARCHIVE_ENTRY_DIGEST_MD5:
		len = sizeof(entry->digest.md5);
		break;
	case ARCHIVE_ENTRY_DIGEST_RMD160:
		len = sizeof(entry->digest.rmd160);
		break;
	case ARCHIVE_ENTRY_DIGEST_SHA1:
		len = sizeof(entry->digest.sha1);
		break;
	case ARCHIVE_ENTRY_DIGEST_SHA256:
		len = sizeof(entry->digest.sha256);
		break;
	case ARCHIVE_ENTRY_DIGEST_SHA384:
		len = sizeof(entry->digest.sha384);
		break;
	case ARCHIVE_ENTRY_DIGEST_SHA512:
		len = sizeof(entry->digest.sha512);
		break;

重构后

    match type_0 {
        1 => len = size_of::<[u8; 16]>() as u64,
        2 => len = size_of::<[u8; 20]>() as u64,
        3 => len = size_of::<[u8; 20]>() as u64,
        4 => len = size_of::<[u8; 32]>() as u64,
        5 => len = size_of::<[u8; 48]>() as u64,
        6 => len = size_of::<[u8; 64]>() as u64,
        _ => {
            archive_set_error_safe!(
                &mut a_safe.archive as *mut archive,
                ARCHIVE_MTREE_DEFINED_PARAM.archive_errno_programmer,
                b"Internal error: Unknown digest type\x00" as *const u8
            );
            return ARCHIVE_MTREE_DEFINED_PARAM.archive_fatal;
        }
    }

重构后的len中没有使用entry->digest.sha256类似方式取值,而是重新定义了一遍,结构体archive_entry、ae_digest均已重构,建议使用重构前的方式实现;原代码中的定义的宏均未体现,难以理解123456所代表的含义

评论 (7)

hanhuihui 创建了任务

Hi han_hui_hui, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Base-service, and any of the maintainers: @hexiaowen , @zhujianwei001 , @谢志鹏 , @Monday , @Sora5175 , @Kevin , @lcynju , @huangduirong

openeuler-ci-bot 添加了
 
sig/Base-service
标签

类似这种情况很多,建议C代码中涉及到struct的都仔细排查下。。
例如archive_read_support_format_lha.rs中的archive_read_format_lha_read_header函数
重构前

	struct archive_wstring linkname;
	struct archive_wstring pathname;
	struct lha *lha;
	const unsigned char *p;
	const char *signature;
	int err;
	struct archive_mstring conv_buffer;
	const wchar_t *conv_buffer_p;

重构后

    let mut linkname: archive_wstring = archive_wstring {
        s: 0 as *mut wchar_t,
        length: 0,
        buffer_length: 0,
    };
    let mut pathname: archive_wstring = archive_wstring {
        s: 0 as *mut wchar_t,
        length: 0,
        buffer_length: 0,
    };
    let safe_a = unsafe { &mut *a };
    let mut p: *const u8 = 0 as *const u8;
    let mut signature: *const u8 = 0 as *const u8;
    let mut err: i32 = 0;
    let mut conv_buffer: archive_mstring = archive_mstring {
        aes_mbs: archive_string {
            s: 0 as *mut u8,
            length: 0,
            buffer_length: 0,
        },
        aes_utf8: archive_string {
            s: 0 as *mut u8,
            length: 0,
            buffer_length: 0,
        },
        aes_wcs: archive_wstring {
            s: 0 as *mut wchar_t,
            length: 0,
            buffer_length: 0,
        },
        aes_mbs_in_locale: archive_string {
            s: 0 as *mut u8,
            length: 0,
            buffer_length: 0,
        },
        aes_set: 0,
    };

贴出的这部分代码为rust结构体的初始化

rust已经定义好的结构体不能复用吗

我理解应该是可以直接用的吧,不然预先定义结构体的意义是啥
输入图片说明

可以直接使用,这里是结构体初始化赋值操作,并非重复定义

hanhuihui 修改了描述

此处为漏改的部分,新提交的pr已解决:!93:解决部分Issue提到的问题:解决部分Issue提到的问题:解决部分Issue提到的问题

lcynju 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(3)
5329419 openeuler ci bot 1632792936
1
https://gitee.com/openeuler/libarchive-rust.git
git@gitee.com:openeuler/libarchive-rust.git
openeuler
libarchive-rust
libarchive-rust

搜索帮助

344bd9b3 5694891 D2dac590 5694891