checker: disallow implicit conversion from fixed array to fooptr (#8823)

pull/8979/head
Nick Treleaven 2021-02-25 23:28:47 +00:00 committed by GitHub
parent 639061be6c
commit c03798e390
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 42 additions and 18 deletions

View File

@ -147,9 +147,13 @@ pub fn (n Number) str() string {
// .hexstr returns a hexadecimal representation of the bignum `n` // .hexstr returns a hexadecimal representation of the bignum `n`
pub fn (n Number) hexstr() string { pub fn (n Number) hexstr() string {
mut buf := [8192]byte{} mut buf := [8192]byte{}
mut s := ''
unsafe {
bp := &buf[0]
// NB: C.bignum_to_string(), returns the HEXADECIMAL representation of the bignum n // NB: C.bignum_to_string(), returns the HEXADECIMAL representation of the bignum n
C.bignum_to_string(&n, buf, 8192) C.bignum_to_string(&n, bp, 8192)
s := unsafe { tos_clone(buf) } s = tos_clone(bp)
}
if s.len == 0 { if s.len == 0 {
return '0' return '0'
} }

View File

@ -41,20 +41,21 @@ fn (req &Request) ssl_do(port int, method Method, host_name string, path string)
C.BIO_puts(web, req_headers.str) C.BIO_puts(web, req_headers.str)
mut content := strings.new_builder(100) mut content := strings.new_builder(100)
mut buff := [bufsize]byte{} mut buff := [bufsize]byte{}
bp := &buff[0]
mut readcounter := 0 mut readcounter := 0
for { for {
readcounter++ readcounter++
len := unsafe { C.BIO_read(web, buff, bufsize) } len := unsafe { C.BIO_read(web, bp, bufsize) }
if len <= 0 { if len <= 0 {
break break
} }
$if debug_http ? { $if debug_http ? {
eprintln('ssl_do, read ${readcounter:4d} | len: $len') eprintln('ssl_do, read ${readcounter:4d} | len: $len')
eprintln('-'.repeat(20)) eprintln('-'.repeat(20))
eprintln(unsafe { tos(buff, len) }) eprintln(unsafe { tos(bp, len) })
eprintln('-'.repeat(20)) eprintln('-'.repeat(20))
} }
unsafe { content.write_bytes(buff, len) } unsafe { content.write_bytes(bp, len) }
} }
if web != 0 { if web != 0 {
C.BIO_free_all(web) C.BIO_free_all(web)

View File

@ -276,7 +276,7 @@ pub fn exec(cmd string) ?Result {
mut result := false mut result := false
unsafe { unsafe {
result = C.ReadFile(child_stdout_read, buf, 1000, voidptr(&bytes_read), 0) result = C.ReadFile(child_stdout_read, buf, 1000, voidptr(&bytes_read), 0)
read_data.write_bytes(buf, int(bytes_read)) read_data.write_bytes(&buf[0], int(bytes_read))
} }
if result == false || int(bytes_read) == 0 { if result == false || int(bytes_read) == 0 {
break break

View File

@ -46,13 +46,6 @@ pub fn (mut c Checker) check_basic(got table.Type, expected table.Type) bool {
return true return true
} }
} }
// e.g. [4096]byte vs byteptr
if got_sym.kind == .array_fixed {
info := got_sym.info as table.ArrayFixed
if c.table.type_to_str(info.elem_type) == c.table.type_to_str(expected).trim('ptr') {
return true
}
}
if exp_sym.kind in [.voidptr, .any] || got_sym.kind in [.voidptr, .any] { if exp_sym.kind in [.voidptr, .any] || got_sym.kind in [.voidptr, .any] {
return true return true
} }

View File

@ -0,0 +1,18 @@
vlib/v/checker/tests/fixed_array_conv.vv:3:3: error: mismatched types `voidptr` and `[2]int`
1 | arr := [2,3]!
2 | mut p := voidptr(0)
3 | p = arr
| ^
4 | mut ip := &int(0)
5 | ip = arr
vlib/v/checker/tests/fixed_array_conv.vv:5:4: error: mismatched types `&int` and `[2]int`
3 | p = arr
4 | mut ip := &int(0)
5 | ip = arr
| ^
6 | _ = &int(arr)
vlib/v/checker/tests/fixed_array_conv.vv:6:6: error: cannot cast a fixed array (use e.g. `&arr[0]` instead)
4 | mut ip := &int(0)
5 | ip = arr
6 | _ = &int(arr)
| ~~~~~~~~

View File

@ -0,0 +1,6 @@
arr := [2,3]!
mut p := voidptr(0)
p = arr
mut ip := &int(0)
ip = arr
_ = &int(arr)

View File

@ -30,8 +30,9 @@ pub fn vhash() string {
mut buf := [50]byte{} mut buf := [50]byte{}
buf[0] = 0 buf[0] = 0
unsafe { unsafe {
C.snprintf(charptr(&buf[0]), 50, '%s', C.V_COMMIT_HASH) bp := &buf[0]
return tos_clone(buf) C.snprintf(charptr(bp), 50, '%s', C.V_COMMIT_HASH)
return tos_clone(bp)
} }
} }
@ -98,8 +99,9 @@ pub fn githash(should_get_from_filesystem bool) string {
mut buf := [50]byte{} mut buf := [50]byte{}
buf[0] = 0 buf[0] = 0
unsafe { unsafe {
C.snprintf(charptr(&buf[0]), 50, '%s', C.V_CURRENT_COMMIT_HASH) bp := &buf[0]
return tos_clone(buf) C.snprintf(charptr(bp), 50, '%s', C.V_CURRENT_COMMIT_HASH)
return tos_clone(bp)
} }
} }