On Monday, 30 August 2021 at 11:07:31 UTC, Iain Buclaw wrote:
> On Monday, 30 August 2021 at 10:43:33 UTC, Steven Schveighoffer wrote:
> On 8/30/21 6:40 AM, Johan wrote:
> I think it's worthwhile to create a random testcase generator and let it run (+ execute the test) for a day or two...
Max had said he was going to try and cobble something like this together during beerconf.
I had raised a bug report about doing such a thing a couple months back too.
https://issues.dlang.org/show_bug.cgi?id=22074
Something like that, but then specific for bit fields that includes execution of C/D code, something like this:
- Randomly generate C file with a struct+bitfields type definition:
struct Test {
{<empty>|some __alignment...} {<empty>|signed|unsigned} {int|char|long|size_t|float|...} member1 {<empty>|:<some number 0..bitwidth of the storage type};
... repeat for member2, member3, random number of members
}
void resetMember1_C(Test* t)
{
t->member1 = 0;
}
...repeat for how many members there are
size_t sizeofTest_C()
{
return sizeof(Test);
}
- While generating the C file, you also generate a D file:
extern(C)
struct Test {
// ofcourse corresponding to the generated C type!
{<empty>|align(...)} {int|uint|bool|byte|char|long|size_t|float|...} member1 {<empty>|:<some number 0..bitwidth of the storage type};
... repeat for member2, member3, random number of members
}
extern(C) void resetMember1_C(Test* t);
void resetMember1_D(Test* t)
{
t.member1 = 0;
}
...repeat for how many members there are
extern(C) size_t sizeofTest_C();
size_t sizeofTest_D()
{
return Test.sizeof();
}
void main()
{
assert(sizeofTest_C() == sizeofTest_D());
foreach(i; number of members in Test) {
Test s_C;
Test s_D;
memset(&s_C, 0xFF, Test.sizeof);
memset(&s_D, 0xFF, Test.sizeof);
resetMemberi_C(&s_C);
resetMemberi_D(&s_D);
assert(memcmp(&s_C, &s_D, Test.sizeof));
}
}
- Compile and run at -O0 and -O3 on every arch supported. Make sure that asserts are not discarded at high optimization level.
And then loop&repeat these steps for a long time.
cheers,
Johan