微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存地址的标准单元测试

如何解决内存地址的标准单元测试

最近,我一直在重新编码自己的printf函数,并使用Criterion C库对该单元进行测试。

当我尝试测试%p标志(打印指针的地址)时,我只是被困在那里试图找出如何预测我将要拥有的内存地址。

我不确定是否可以在标准开始测试之前将其“提取”并发送到断言中,但是似乎指针,内存地址或文档中没有任何相关内容

对于nil指针,我可以预测结果(“ nil”字符串),例如:

Test(my_printf,nil_pointer,.init=cr_redirect_stdout)
{
    char *string = NULL;

    my_printf("This is a nil %p.",string);
    cr_assert_stdout_eq_str("This is a nil (nil).");
}

但是对于一个未知的未来内存地址,我只是被困住了:

Test(my_printf,pointer_address_1,.init=cr_redirect_stdout)
{
    char *string = "hello world";

    my_printf("valid pointer: %p.",string);
    cr_assert_stdout_eq_str("valid pointer: 0x???????");
}

我想知道在测试过程中是否有一种方法可以预测/将指针的地址发送到我的断言中,而不是问号。

我不知道我是否很清楚,否则请告诉我,以便我可以帮助您了解我的问题。

解决方法

为什么要为此使用“真正的”指针?您可以很好地制作自己的假指针,毕竟,指针只是一个值。如果您的实现是合理的,那么您的打印功能实际上就不需要知道指针是否有效即可打印其值。

Test(my_printf,pointer_address_1,.init=cr_redirect_stdout)
{
    my_printf("pointer: %p",(void *)0x12345678);
    cr_assert_stdout_eq_str("pointer: 0x12345678");
}

如果您真的想使用有效的指针进行测试,则可以尝试使用mmap在特定地址处请求页面,但这是Linux特定的,完全不需要: / p>

Test(my_printf,.init=cr_redirect_stdout)
{
    unsigned char *ptr = mmap(0x12345000,0x1000,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
    if (ptr == MAP_FAILED) {
        // Fail test
    }

    ptr += 0x678;
    my_printf("pointer: %p",ptr);
    cr_assert_stdout_eq_str("pointer: 0x12345678");
}

请注意mmap仅将您请求的地址用作提示,并且仅映射整个页面,因此该地址的最后3个十六进制数字始终为000。 / p>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。