【问题标题】:Unit-testing functions with void pointers in C++C++ 中带有 void 指针的单元测试函数
【发布时间】:2015-02-18 23:53:19
【问题描述】:

我在日常工作中是一名初级软件工程师,使用 C#/WPF/Prism,我一直在尝试在业余时间自学其他语言和库以扩大我的视野。我最近一直在研究 C++,同时通过 Google 的测试和模拟库进行单元测试,并且在从 C# 思维方式转移到 C++ 世界方面做得相对较好。虽然一些概念,如多态性和接口,从 C# 迁移过来是完全有意义的,但其中一些对我来说有点令人费解,比如指针算术。我最近一直在研究较低级别的内存,这是我在 C# 中从未见过的,并且开始为我在业余时间从事的一个 3D 模拟项目编写内存分配器。这让我想到了我的问题。

我有一个看起来像这样的函数:

    inline u8 AlignForwardAdjustment(const void* address, u8 alignment)
    {
        u8 adjustment = alignment - (reinterpret_cast<uptr>(address)& static_cast<uptr>(alignment - 1));

        if (adjustment == alignment)
        {
            return 0; //already aligned
        }

        return adjustment;
    }

这不是我自己写的,因为我发现它是我用来学习如何进行手动内存分配器的指南的一部分。然而,作为更多地理解这个主题的一部分,我试图编写单元测试来证明我的分配器工作,从我能找到的最低级别开始。

这是我用于对齐内存的辅助函数之一,它接受并返回一个 void*。据我了解,这意味着它正在返回一些未格式化或类型未知的内存块的指针,这在这种情况下是有意义的。我的问题是,有没有办法为这种方法编写单元或集成测试?在 C# 中,我通常会尝试测试我可以从类外访问的任何函数,但老实说,我不知道如何编写一个测试,该测试会提交一个 Void*(设置为我期望的值)然后能够确保返回的指针正确对齐。

我可以做任何类型的转换来将 Uint 传递给 void* 并检查另一端的数学吗?或者,我应该把这样的函数写成不可测试的吗?任何帮助将不胜感激,甚至是朝着正确方向轻推。

提前谢谢你!

【问题讨论】:

  • 对不起,这个网站的新手,显然没有足够的代表来对您的评论进行投票。不过感谢您的帮助!

标签: c++ unit-testing memory-management googletest void-pointers


【解决方案1】:

查找 intptr_t。 - 凯克

Kec 完全正确!答案很简单:

const intptr_t given = 30;
const intptr_t expected = 2;

auto returnedValue = pointerMath::AlignForwardAdjustment((void*)given, 8);

EXPECT_EQ(expected, returnedValue);

这为单元测试提供了一个很好的可重现设置和结果。

再次感谢kec!会将您的评论标记为答案,但我似乎找不到这样做的方法。

【讨论】:

  • 您是否需要该演员取决于blah 的类型以及您想用castBackOut 做什么。顺便说一句,转换为 void * 在 C++ 中是隐式的,所以你可能不需要它。
  • 是吗?当我尝试在没有强制转换为 void* 的情况下传入 castedPtr 时,它抱怨它正在寻找一个 const void*。
  • 哎呀,这是一个复制粘贴错误。 castedPtr 是一个 intptr_t,在这个特定的代码示例中它应该是startingPointer,但我忘了更改它。马上编辑!现在我明白你为什么问什么是……这是我在测试时在编辑器中使用的变量。
  • 啊,是的,在这种情况下,您确实需要演员表。从任何指针类型到void * 的转换是隐式的,但不是从整数类型。不过,从 void * 转换回指针需要强制转换。
  • 知道了,所以我以正确的方式进行,将更新此代码以作为我的实际测试并将此代码搁置。感谢大家的帮助!
猜你喜欢
  • 2018-09-20
  • 2021-03-31
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2018-08-25
相关资源
最近更新 更多