builtin: Fix undefined behaviour when allocating empty structs (#4088)

pull/4091/head
radare 2020-03-21 12:24:34 +01:00 committed by GitHub
parent 7b1b647832
commit cc75fe4fe5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 2 deletions

View File

@ -177,6 +177,9 @@ pub fn free(ptr voidptr) {
}
pub fn memdup(src voidptr, sz int) voidptr {
if sz == 0 {
return vcalloc(1)
}
mem := malloc(sz)
return C.memcpy(mem, src, sz)
}

View File

@ -1,10 +1,10 @@
struct A{
struct A {
mut:
val int
nums []int
}
struct B{
struct B {
mut:
a A
}
@ -26,6 +26,9 @@ struct Foo {
@type string
}
struct Empty {
}
//We need to make sure that this compiles with all the reserved names.
struct ReservedKeywords {
delete int
@ -55,6 +58,12 @@ struct ReservedKeywords {
while int
}
fn test_empty_struct() {
d := &Empty{}
println(d) // != voidptr(0)
println(sizeof(Empty)) // == 0
}
fn test_struct_levels() {
mut c := C{}
assert c.nums.len == 0