2017-07-18 43 views
1

我已经被赋予了重构一堆C++代码的任务,这些代码有很多数学知识,而不是解释它的功能。 为了做到这一点,我设置了一堆自动测试,给出随机数据比较新旧代码结果。生成用于测试的随机结构的通用方法

事情是,尽管生成任意大小的随机向量很简单,但我有很多带有许多公共字段(> 20)的“struct”,我有点厌倦了编写自定义函数来填充它们。

可以想到使用某种脚本来解析定义并自动生成相应的生成器函数。

您认为这是一个好主意吗? 有没有这样的事情?

+0

我想这种测试的适当术语将是* fuzzing *。但在编写测试来比较新旧代码之前,您可能应该弄清楚现有代码的作用,并编写测试来检查其正确性。 – VTT

+0

也许我应该,但我不能。我现在可以做的最好的事情是确保结果与以前相同。 – PeppeDx

+0

我所做的是向结构添加反射(boost hana或类似的,[visit_struct](https://github.com/cbeck88/visit_struct))并添加访问者以根据其类型填充随机值(以及某个时间与会员名称)。 – Jarod42

回答

1

如果你只有Plain Old Data,那么结构大体上只是一块内存,对编译器有一定的意义。

这意味着你可以把它当作这样的,根本用随机字节填充它,用工会:

struct a { 
    int i; 
    char c; 
    float f; 
    double d; 
}; 

union u { 
    char arr[sizeof(a)]; 
    a record; 
}; 

char generateRandomChar(); // implement some random char generation 

int main() { 
    u foo; 
    for (char& c : foo.arr) { 
     c = generateRandomChar(); 
    } 
    std::cout << "i:" << foo.record.i 
       << "\nc:" << foo.record.c 
       << "\nf:" << foo.record.f 
       << "\nd:" << foo.record.d; 
} 

See it live!

从技术上讲,这是Undefined Behavior。实际上,它在大多数编译器中都有明确的定义。

+0

如果你已经知道它是一个UB的UB,你为什么不提到另一种选择:memcpy? –

+0

@好问题。我想过了,但你仍然必须以某种方式生成(伪)随机字节。大概是一个接一个,因为大多数图书馆(包括标准图书馆,据我所知)都这样做。如果我已经逐一生成它们,为什么我会将它们存储在不同的内存位置,以便我可以“memcpy”它们? –

+0

当然,如果你可以批量生成它们,这将是一个不错的性能提升,并且(可能)很小的内存成本。 –