gpt4 book ai didi

用于验证相等运算符的 C++ 测试随着时间的推移与结构保持一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:06 26 4
gpt4 key购买 nike

我对@TomalakGeretkal 投了赞成票,因为他对按契约(Contract)做了很好的说明;我没有接受答案,因为我的问题是如何以编程方式检查 equals 函数。


我有一个 POD 结构和一个相等运算符,这是一个拥有超过 100 名工程师的系统的(非常)小部分。

随着时间的推移,我希望结构被修改(成员添加/删除/重新排序),我想编写一个测试来验证相等操作是否正在测试结构的每个成员(例如,作为结构保持最新变化)。

正如 Tomalak 指出的那样 - 评论和“按契约(Contract)”通常是执行此操作的最佳/唯一方式;然而,在我的情况下,我预计会出现问题,并想探索是否有任何方法可以主动捕获(至少很多)修改。

我没有想出一个令人满意的答案 - 这是我想到的最好的答案:

-new up two instances struct (x, y), fill each with identical non-zero data.
-check x==y
-modify x "byte by byte"
-take ptr to be (unsigned char*)&x
-iterator over ptr (for sizeof(x))
-increment the current byte
-check !(x==y)
-decrement the current byte
-check x==y

如果相等运算符捕捉到每个字节,则测试通过(注意:对此有一个警告 - 并非所有字节都用于 x 的编译器表示中,因此测试必须“跳过”这些字节 - 例如硬代码忽略字节)

我提议的测试有重大问题:(至少)“不关心”字节,以及增加 x 中类型的一个字节可能不会导致该内存位置的变量的有效值这一事实。

有更好的解决方案吗?

(这应该无关紧要,但我使用的是 VS2008,rtti 已关闭,googletest 套件)

最佳答案

虽然很想通过这样的自检来使代码“防呆”,但根据我的经验,让自检本身防呆是,好吧,傻瓜的差事。

保持简单并将任何更改的影响本地化。在结构定义中写一条注释,明确如果结构是,则相等运算符也必须更新;那么,如果失败了,那只是程序员的错。

知道这对你来说似乎不是最佳选择,因为它可能会在未来留下用户错误的可能性,但实际上你无法解决这个问题(至少在不让你的代码变得可怕的情况下)复杂),通常最实际的做法就是不去打扰。

关于用于验证相等运算符的 C++ 测试随着时间的推移与结构保持一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com