checker: warn when casting a fixed array (use `&arr[0]` instead) (#8787)

pull/8811/head
Nick Treleaven 2021-02-17 19:45:11 +00:00 committed by GitHub
parent 177c8bfc78
commit 4ccf991f61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 19 additions and 17 deletions

View File

@ -90,8 +90,8 @@ fn print_backtrace_skipping_top_frames_linux(skipframes int) bool {
C.tcc_backtrace("Backtrace") C.tcc_backtrace("Backtrace")
return false return false
} }
buffer := [100]byteptr{} buffer := [100]voidptr{}
nr_ptrs := C.backtrace(voidptr(buffer), 100) nr_ptrs := C.backtrace(&buffer[0], 100)
if nr_ptrs < 2 { if nr_ptrs < 2 {
eprintln('C.backtrace returned less than 2 frames') eprintln('C.backtrace returned less than 2 frames')
return false return false
@ -117,8 +117,9 @@ fn print_backtrace_skipping_top_frames_linux(skipframes int) bool {
buf := [1000]byte{} buf := [1000]byte{}
mut output := '' mut output := ''
unsafe { unsafe {
for C.fgets(charptr(buf), 1000, f) != 0 { bp := &buf[0]
output += tos(byteptr(buf), vstrlen(byteptr(buf))) for C.fgets(charptr(bp), 1000, f) != 0 {
output += tos(bp, vstrlen(bp))
} }
} }
output = output.trim_space() + ':' output = output.trim_space() + ':'

View File

@ -34,8 +34,7 @@ pub fn (mut con TcpConn) read_line() string {
break break
} }
} }
bufbp := byteptr(buf) line = unsafe { tos_clone(&buf[0]) }
line = unsafe { tos_clone(bufbp) }
if eol_idx > 0 { if eol_idx > 0 {
// At this point, we are sure that recv returned valid data, // At this point, we are sure that recv returned valid data,
// that contains *at least* one line. // that contains *at least* one line.

View File

@ -93,8 +93,8 @@ pub fn ls(path string) ?[]string {
if isnil(ent) { if isnil(ent) {
break break
} }
bptr := byteptr(ent.d_name)
unsafe { unsafe {
bptr := byteptr(&ent.d_name[0])
if bptr[0] == 0 || (bptr[0] == `.` && bptr[1] == 0) if bptr[0] == 0 || (bptr[0] == `.` && bptr[1] == 0)
|| (bptr[0] == `.` && bptr[1] == `.` && bptr[2] == 0) { || (bptr[0] == `.` && bptr[1] == `.` && bptr[2] == 0) {
continue continue
@ -169,8 +169,8 @@ pub fn exec(cmd string) ?Result {
buf := [4096]byte{} buf := [4096]byte{}
mut res := strings.new_builder(1024) mut res := strings.new_builder(1024)
unsafe { unsafe {
for C.fgets(charptr(buf), 4096, f) != 0 { bufbp := &buf[0]
bufbp := byteptr(buf) for C.fgets(charptr(bufbp), 4096, f) != 0 {
res.write_bytes(bufbp, vstrlen(bufbp)) res.write_bytes(bufbp, vstrlen(bufbp))
} }
} }
@ -210,11 +210,11 @@ pub fn (mut c Command) read_line() string {
buf := [4096]byte{} buf := [4096]byte{}
mut res := strings.new_builder(1024) mut res := strings.new_builder(1024)
unsafe { unsafe {
for C.fgets(charptr(buf), 4096, c.f) != 0 { bufbp := &buf[0]
bufbp := byteptr(buf) for C.fgets(charptr(bufbp), 4096, c.f) != 0 {
len := vstrlen(bufbp) len := vstrlen(bufbp)
for i in 0 .. len { for i in 0 .. len {
if int(bufbp[i]) == `\n` { if bufbp[i] == `\n` {
res.write_bytes(bufbp, i) res.write_bytes(bufbp, i)
return res.str() return res.str()
} }

View File

@ -102,12 +102,12 @@ pub fn ls(path string) ?[]string {
// NOTE:TODO: once we have a way to convert utf16 wide character to utf8 // NOTE:TODO: once we have a way to convert utf16 wide character to utf8
// we should use FindFirstFileW and FindNextFileW // we should use FindFirstFileW and FindNextFileW
h_find_files := C.FindFirstFile(path_files.to_wide(), voidptr(&find_file_data)) h_find_files := C.FindFirstFile(path_files.to_wide(), voidptr(&find_file_data))
first_filename := unsafe { string_from_wide(&u16(find_file_data.c_file_name)) } first_filename := unsafe { string_from_wide(&find_file_data.c_file_name[0]) }
if first_filename != '.' && first_filename != '..' { if first_filename != '.' && first_filename != '..' {
dir_files << first_filename dir_files << first_filename
} }
for C.FindNextFile(h_find_files, voidptr(&find_file_data)) > 0 { for C.FindNextFile(h_find_files, voidptr(&find_file_data)) > 0 {
filename := unsafe { string_from_wide(&u16(find_file_data.c_file_name)) } filename := unsafe { string_from_wide(&find_file_data.c_file_name[0]) }
if filename != '.' && filename != '..' { if filename != '.' && filename != '..' {
dir_files << filename.clone() dir_files << filename.clone()
} }

View File

@ -3911,6 +3911,8 @@ pub fn (mut c Checker) cast_expr(mut node ast.CastExpr) table.Type {
ft := c.table.type_to_str(node.expr_type) ft := c.table.type_to_str(node.expr_type)
tt := c.table.type_to_str(node.typ) tt := c.table.type_to_str(node.typ)
c.warn('casting `$ft` to `$tt` is only allowed in `unsafe` code', node.pos) c.warn('casting `$ft` to `$tt` is only allowed in `unsafe` code', node.pos)
} else if from_type_sym.kind == .array_fixed && !node.expr_type.is_ptr() {
c.warn('cannot cast a fixed array (use e.g. `&arr[0]` instead)', node.pos)
} }
if node.has_arg { if node.has_arg {
c.expr(node.arg) c.expr(node.arg)

View File

@ -30,7 +30,7 @@ pub fn vhash() string {
mut buf := [50]byte{} mut buf := [50]byte{}
buf[0] = 0 buf[0] = 0
unsafe { unsafe {
C.snprintf(charptr(buf), 50, '%s', C.V_COMMIT_HASH) C.snprintf(charptr(&buf[0]), 50, '%s', C.V_COMMIT_HASH)
return tos_clone(buf) return tos_clone(buf)
} }
} }
@ -98,7 +98,7 @@ 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), 50, '%s', C.V_CURRENT_COMMIT_HASH) C.snprintf(charptr(&buf[0]), 50, '%s', C.V_CURRENT_COMMIT_HASH)
return tos_clone(buf) return tos_clone(buf)
} }
} }

View File

@ -215,7 +215,7 @@ pub fn (mut ws Client) parse_frame_header() ?Frame {
mut rbuff := [1]byte{} mut rbuff := [1]byte{}
mut mask_end_byte := 0 mut mask_end_byte := 0
for ws.state == .open { for ws.state == .open {
read_bytes := ws.socket_read_ptr(byteptr(rbuff), 1) ? read_bytes := ws.socket_read_ptr(&rbuff[0], 1) ?
if read_bytes == 0 { if read_bytes == 0 {
// this is probably a timeout or close // this is probably a timeout or close
continue continue