mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
fixes ptr to cstring warnings[backport] (#20848)
* fix =#13790 ptr char (+friends) should not implicitly convert to cstring
* Apply suggestions from code review
* first round; compiles on windows
* nimPreviewSlimSystem
* conversion is unsafe, cast needed
* fixes more tests
* fixes asyncnet
* another try another error
* last one
* true
* one more
* why bugs didn't show at once
* add `nimPreviewCstringConversion` switch
* typo
* fixes ptr to cstring warnings[backport]
* add fixes
Co-authored-by: xflywind <43030857+xflywind@users.noreply.github.com>
(cherry picked from commit 06cd15663d)
This commit is contained in:
@@ -912,7 +912,7 @@ proc getSymbol(L: var Lexer, tok: var Token) =
|
||||
else: break
|
||||
tokenEnd(tok, pos-1)
|
||||
h = !$h
|
||||
tok.ident = L.cache.getIdent(addr(L.buf[L.bufpos]), pos - L.bufpos, h)
|
||||
tok.ident = L.cache.getIdent(cast[cstring](addr(L.buf[L.bufpos])), pos - L.bufpos, h)
|
||||
if (tok.ident.id < ord(tokKeywordLow) - ord(tkSymbol)) or
|
||||
(tok.ident.id > ord(tokKeywordHigh) - ord(tkSymbol)):
|
||||
tok.tokType = tkSymbol
|
||||
@@ -926,7 +926,7 @@ proc getSymbol(L: var Lexer, tok: var Token) =
|
||||
proc endOperator(L: var Lexer, tok: var Token, pos: int,
|
||||
hash: Hash) {.inline.} =
|
||||
var h = !$hash
|
||||
tok.ident = L.cache.getIdent(addr(L.buf[L.bufpos]), pos - L.bufpos, h)
|
||||
tok.ident = L.cache.getIdent(cast[cstring](addr(L.buf[L.bufpos])), pos - L.bufpos, h)
|
||||
if (tok.ident.id < oprLow) or (tok.ident.id > oprHigh): tok.tokType = tkOpr
|
||||
else: tok.tokType = TokType(tok.ident.id - oprLow + ord(tkColon))
|
||||
L.bufpos = pos
|
||||
|
||||
@@ -16,7 +16,7 @@ import types
|
||||
proc `&=`(c: var MD5Context, s: string) = md5Update(c, s, s.len)
|
||||
proc `&=`(c: var MD5Context, ch: char) =
|
||||
# XXX suspicious code here; relies on ch being zero terminated?
|
||||
md5Update(c, unsafeAddr ch, 1)
|
||||
md5Update(c, cast[cstring](unsafeAddr ch), 1)
|
||||
proc `&=`(c: var MD5Context, r: Rope) =
|
||||
for l in leaves(r): md5Update(c, l.cstring, l.len)
|
||||
proc `&=`(c: var MD5Context, i: BiggestInt) =
|
||||
|
||||
@@ -133,7 +133,7 @@ proc getErrInfo(db: var DbConn): tuple[res: int, ss, ne, msg: string] {.
|
||||
511.TSqlSmallInt, retSz.addr)
|
||||
except:
|
||||
discard
|
||||
return (res.int, $(addr sqlState), $(addr nativeErr), $(addr errMsg))
|
||||
return (res.int, $(cast[cstring](addr sqlState)), $cast[cstring](addr nativeErr), $cast[cstring](addr errMsg))
|
||||
|
||||
proc dbError*(db: var DbConn) {.
|
||||
tags: [ReadDbEffect, WriteDbEffect], raises: [DbError] .} =
|
||||
@@ -183,7 +183,7 @@ proc sqlGetDBMS(db: var DbConn): string {.
|
||||
db.sqlCheck(SQLGetInfo(db.hDb, SQL_DBMS_NAME, cast[SqlPointer](buf.addr),
|
||||
4095.TSqlSmallInt, sz.addr))
|
||||
except: discard
|
||||
return $(addr buf)
|
||||
return $(cast[cstring](addr buf))
|
||||
|
||||
proc dbQuote*(s: string): string {.noSideEffect.} =
|
||||
## DB quotes the string.
|
||||
@@ -294,7 +294,7 @@ iterator fastRows*(db: var DbConn, query: SqlQuery,
|
||||
buf[0] = '\0'
|
||||
db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR,
|
||||
cast[cstring](buf.addr), 4095, sz.addr))
|
||||
rowRes[colId-1] = $(addr buf)
|
||||
rowRes[colId-1] = $cast[cstring]((addr buf))
|
||||
yield rowRes
|
||||
res = SQLFetch(db.stmt)
|
||||
properFreeResult(SQL_HANDLE_STMT, db.stmt)
|
||||
@@ -322,7 +322,7 @@ iterator instantRows*(db: var DbConn, query: SqlQuery,
|
||||
buf[0] = '\0'
|
||||
db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR,
|
||||
cast[cstring](buf.addr), 4095, sz.addr))
|
||||
rowRes[colId-1] = $(addr buf)
|
||||
rowRes[colId-1] = $cast[cstring](addr buf)
|
||||
yield (row: rowRes, len: cCnt.int)
|
||||
res = SQLFetch(db.stmt)
|
||||
properFreeResult(SQL_HANDLE_STMT, db.stmt)
|
||||
@@ -361,7 +361,7 @@ proc getRow*(db: var DbConn, query: SqlQuery,
|
||||
buf[0] = '\0'
|
||||
db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR,
|
||||
cast[cstring](buf.addr), 4095, sz.addr))
|
||||
rowRes[colId-1] = $(addr buf)
|
||||
rowRes[colId-1] = $cast[cstring](addr buf)
|
||||
res = SQLFetch(db.stmt)
|
||||
result = rowRes
|
||||
properFreeResult(SQL_HANDLE_STMT, db.stmt)
|
||||
@@ -389,7 +389,7 @@ proc getAllRows*(db: var DbConn, query: SqlQuery,
|
||||
buf[0] = '\0'
|
||||
db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR,
|
||||
cast[cstring](buf.addr), 4095, sz.addr))
|
||||
rowRes[colId-1] = $(addr buf)
|
||||
rowRes[colId-1] = $cast[cstring](addr buf)
|
||||
rows.add(rowRes)
|
||||
res = SQLFetch(db.stmt)
|
||||
result = rows
|
||||
|
||||
@@ -18,7 +18,7 @@ type Uname* = object
|
||||
sysname*, nodename*, release*, version*, machine*: string
|
||||
|
||||
template charArrayToString(input: typed): string =
|
||||
$cstring(addr input)
|
||||
$cast[cstring](addr input)
|
||||
|
||||
proc uname*(): Uname =
|
||||
## Provides system information in a `Uname` struct with sysname, nodename,
|
||||
|
||||
@@ -226,7 +226,7 @@ when defineSsl:
|
||||
let len = bioCtrlPending(socket.bioOut)
|
||||
if len > 0:
|
||||
var data = newString(len)
|
||||
let read = bioRead(socket.bioOut, addr data[0], len)
|
||||
let read = bioRead(socket.bioOut, cast[cstring](addr data[0]), len)
|
||||
assert read != 0
|
||||
if read < 0:
|
||||
raiseSSLError()
|
||||
@@ -244,7 +244,7 @@ when defineSsl:
|
||||
var data = await recv(socket.fd.AsyncFD, BufferSize, flags)
|
||||
let length = len(data)
|
||||
if length > 0:
|
||||
let ret = bioWrite(socket.bioIn, addr data[0], length.cint)
|
||||
let ret = bioWrite(socket.bioIn, cast[cstring](addr data[0]), length.cint)
|
||||
if ret < 0:
|
||||
raiseSSLError()
|
||||
elif length == 0:
|
||||
@@ -455,7 +455,7 @@ proc send*(socket: AsyncSocket, data: string,
|
||||
when defineSsl:
|
||||
var copy = data
|
||||
sslLoop(socket, flags,
|
||||
sslWrite(socket.sslHandle, addr copy[0], copy.len.cint))
|
||||
sslWrite(socket.sslHandle, cast[cstring](addr copy[0]), copy.len.cint))
|
||||
await sendPendingSslData(socket, flags)
|
||||
else:
|
||||
await send(socket.fd.AsyncFD, data, flags)
|
||||
|
||||
@@ -479,13 +479,13 @@ when not useNimNetLite:
|
||||
result = newString(addrLen)
|
||||
let addr6 = addr cast[ptr Sockaddr_in6](sockAddr).sin6_addr
|
||||
when not useWinVersion:
|
||||
if posix.inet_ntop(posix.AF_INET6, addr6, addr result[0],
|
||||
if posix.inet_ntop(posix.AF_INET6, addr6, cast[cstring](addr result[0]),
|
||||
result.len.int32) == nil:
|
||||
raiseOSError(osLastError())
|
||||
if posix.IN6_IS_ADDR_V4MAPPED(addr6) != 0:
|
||||
result.setSlice("::ffff:".len..<addrLen)
|
||||
else:
|
||||
if winlean.inet_ntop(winlean.AF_INET6, addr6, addr result[0],
|
||||
if winlean.inet_ntop(winlean.AF_INET6, addr6, cast[cstring](addr result[0]),
|
||||
result.len.int32) == nil:
|
||||
raiseOSError(osLastError())
|
||||
setLen(result, len(cstring(result)))
|
||||
@@ -507,23 +507,23 @@ when not useNimNetLite:
|
||||
if sockAddr.sa_family.cint == nativeAfInet:
|
||||
let addr4 = addr cast[ptr Sockaddr_in](sockAddr).sin_addr
|
||||
when not useWinVersion:
|
||||
if posix.inet_ntop(posix.AF_INET, addr4, addr strAddress[0],
|
||||
if posix.inet_ntop(posix.AF_INET, addr4, cast[cstring](addr strAddress[0]),
|
||||
strAddress.len.int32) == nil:
|
||||
raiseOSError(osLastError())
|
||||
else:
|
||||
if winlean.inet_ntop(winlean.AF_INET, addr4, addr strAddress[0],
|
||||
if winlean.inet_ntop(winlean.AF_INET, addr4, cast[cstring](addr strAddress[0]),
|
||||
strAddress.len.int32) == nil:
|
||||
raiseOSError(osLastError())
|
||||
elif sockAddr.sa_family.cint == nativeAfInet6:
|
||||
let addr6 = addr cast[ptr Sockaddr_in6](sockAddr).sin6_addr
|
||||
when not useWinVersion:
|
||||
if posix.inet_ntop(posix.AF_INET6, addr6, addr strAddress[0],
|
||||
if posix.inet_ntop(posix.AF_INET6, addr6, cast[cstring](addr strAddress[0]),
|
||||
strAddress.len.int32) == nil:
|
||||
raiseOSError(osLastError())
|
||||
if posix.IN6_IS_ADDR_V4MAPPED(addr6) != 0:
|
||||
strAddress.setSlice("::ffff:".len..<length)
|
||||
else:
|
||||
if winlean.inet_ntop(winlean.AF_INET6, addr6, addr strAddress[0],
|
||||
if winlean.inet_ntop(winlean.AF_INET6, addr6, cast[cstring](addr strAddress[0]),
|
||||
strAddress.len.int32) == nil:
|
||||
raiseOSError(osLastError())
|
||||
else:
|
||||
@@ -582,7 +582,7 @@ when not useNimNetLite:
|
||||
# Cannot use INET6_ADDRSTRLEN here, because it's a C define.
|
||||
result[0] = newString(64)
|
||||
if inet_ntop(name.sin6_family.cint,
|
||||
addr name.sin6_addr, addr result[0][0], (result[0].len+1).int32).isNil:
|
||||
addr name.sin6_addr, cast[cstring](addr result[0][0]), (result[0].len+1).int32).isNil:
|
||||
raiseOSError(osLastError())
|
||||
setLen(result[0], result[0].cstring.len)
|
||||
result[1] = Port(nativesockets.ntohs(name.sin6_port))
|
||||
@@ -619,7 +619,7 @@ when not useNimNetLite:
|
||||
# Cannot use INET6_ADDRSTRLEN here, because it's a C define.
|
||||
result[0] = newString(64)
|
||||
if inet_ntop(name.sin6_family.cint,
|
||||
addr name.sin6_addr, addr result[0][0], (result[0].len+1).int32).isNil:
|
||||
addr name.sin6_addr, cast[cstring](addr result[0][0]), (result[0].len+1).int32).isNil:
|
||||
raiseOSError(osLastError())
|
||||
setLen(result[0], result[0].cstring.len)
|
||||
result[1] = Port(nativesockets.ntohs(name.sin6_port))
|
||||
|
||||
@@ -2375,11 +2375,11 @@ func formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault,
|
||||
frmtstr[3] = '*'
|
||||
frmtstr[4] = floatFormatToChar[format]
|
||||
frmtstr[5] = '\0'
|
||||
L = c_sprintf(addr buf, addr frmtstr, precision, f)
|
||||
L = c_sprintf(cast[cstring](addr buf), cast[cstring](addr frmtstr), precision, f)
|
||||
else:
|
||||
frmtstr[1] = floatFormatToChar[format]
|
||||
frmtstr[2] = '\0'
|
||||
L = c_sprintf(addr buf, addr frmtstr, f)
|
||||
L = c_sprintf(cast[cstring](addr buf), cast[cstring](addr frmtstr), f)
|
||||
result = newString(L)
|
||||
for i in 0 ..< L:
|
||||
# Depending on the locale either dot or comma is produced,
|
||||
|
||||
@@ -106,7 +106,7 @@ func find*(s, sub: cstring, start: Natural = 0, last = 0): int =
|
||||
if sub.len > s.len - start: return -1
|
||||
if sub.len == 1: return find(s, sub[0], start, last)
|
||||
if last == 0 and s.len > start:
|
||||
let found = c_strstr(s[start].unsafeAddr, sub)
|
||||
let found = c_strstr(cast[cstring](s[start].unsafeAddr), sub)
|
||||
if not found.isNil:
|
||||
result = cast[ByteAddress](found) -% cast[ByteAddress](s)
|
||||
else:
|
||||
|
||||
@@ -2038,7 +2038,7 @@ template newException*(exceptn: typedesc, message: string;
|
||||
when hostOS == "standalone" and defined(nogc):
|
||||
proc nimToCStringConv(s: NimString): cstring {.compilerproc, inline.} =
|
||||
if s == nil or s.len == 0: result = cstring""
|
||||
else: result = cstring(addr s.data)
|
||||
else: result = cast[cstring](addr s.data)
|
||||
|
||||
proc getTypeInfo*[T](x: T): pointer {.magic: "GetTypeInfo", benign.}
|
||||
## Get type information for `x`.
|
||||
|
||||
@@ -161,7 +161,7 @@ elif defined(windows) or defined(dos):
|
||||
dec(m)
|
||||
k = k div 10
|
||||
if k == 0: break
|
||||
result = getProcAddress(cast[THINSTANCE](lib), addr decorated)
|
||||
result = getProcAddress(cast[THINSTANCE](lib), cast[cstring](addr decorated))
|
||||
if result != nil: return
|
||||
procAddrError(name)
|
||||
|
||||
|
||||
@@ -397,9 +397,9 @@ proc reportUnhandledErrorAux(e: ref Exception) {.nodestroy, gcsafe.} =
|
||||
xadd(buf, e.name, e.name.len)
|
||||
add(buf, "]\n")
|
||||
if onUnhandledException != nil:
|
||||
onUnhandledException($buf.addr)
|
||||
onUnhandledException($cast[cstring](buf.addr))
|
||||
else:
|
||||
showErrorMessage(buf.addr, L)
|
||||
showErrorMessage(cast[cstring](buf.addr), L)
|
||||
|
||||
proc reportUnhandledError(e: ref Exception) {.nodestroy, gcsafe.} =
|
||||
if unhandledExceptionHook != nil:
|
||||
|
||||
@@ -461,7 +461,7 @@ proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect],
|
||||
while true:
|
||||
# fixes #9634; this pattern may need to be abstracted as a template if reused;
|
||||
# likely other io procs need this for correctness.
|
||||
fgetsSuccess = c_fgets(addr line[pos], sp.cint, f) != nil
|
||||
fgetsSuccess = c_fgets(cast[cstring](addr line[pos]), sp.cint, f) != nil
|
||||
if fgetsSuccess: break
|
||||
when not defined(nimscript):
|
||||
if errno == EINTR:
|
||||
|
||||
@@ -17,7 +17,7 @@ proc reprFloat(x: float): string {.compilerproc.} = return $x
|
||||
|
||||
proc reprPointer(x: pointer): string {.compilerproc.} =
|
||||
result = newString(60)
|
||||
let n = c_sprintf(addr result[0], "%p", x)
|
||||
let n = c_sprintf(cast[cstring](addr result[0]), "%p", x)
|
||||
setLen(result, n)
|
||||
|
||||
proc reprStrAux(result: var string, s: cstring; len: int) =
|
||||
|
||||
@@ -209,7 +209,7 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat,
|
||||
t[ti-2] = ('0'.ord + absExponent mod 10).char
|
||||
absExponent = absExponent div 10
|
||||
t[ti-3] = ('0'.ord + absExponent mod 10).char
|
||||
number = c_strtod(addr t, nil)
|
||||
number = c_strtod(cast[cstring](addr t), nil)
|
||||
|
||||
when defined(nimHasInvariant):
|
||||
{.pop.} # staticBoundChecks
|
||||
|
||||
@@ -89,7 +89,7 @@ proc cstrToNimstr(str: cstring): NimStringV2 {.compilerRtl.} =
|
||||
|
||||
proc nimToCStringConv(s: NimStringV2): cstring {.compilerproc, nonReloadable, inline.} =
|
||||
if s.len == 0: result = cstring""
|
||||
else: result = cstring(unsafeAddr s.p.data)
|
||||
else: result = cast[cstring](unsafeAddr s.p.data)
|
||||
|
||||
proc appendString(dest: var NimStringV2; src: NimStringV2) {.compilerproc, inline.} =
|
||||
if src.len > 0:
|
||||
|
||||
@@ -91,7 +91,7 @@ proc copyStr(s: NimString, start: int): NimString {.compilerproc.} =
|
||||
|
||||
proc nimToCStringConv(s: NimString): cstring {.compilerproc, nonReloadable, inline.} =
|
||||
if s == nil or s.len == 0: result = cstring""
|
||||
else: result = cstring(addr s.data)
|
||||
else: result = cast[cstring](addr s.data)
|
||||
|
||||
proc toNimStr(str: cstring, len: int): NimString {.compilerproc.} =
|
||||
result = rawNewStringNoInit(len)
|
||||
|
||||
@@ -799,10 +799,10 @@ proc md5_File*(file: string): string {.raises: [IOError,Exception].} =
|
||||
while (let bytes = f.readChars(buf); bytes > 0):
|
||||
discard md5_Update(ctx, buf[0].addr, cast[csize_t](bytes))
|
||||
|
||||
discard md5_Final(buf[0].addr, ctx)
|
||||
discard md5_Final(cast[cstring](buf[0].addr), ctx)
|
||||
f.close
|
||||
|
||||
result = hexStr(addr buf)
|
||||
result = hexStr(cast[cstring](addr buf))
|
||||
|
||||
proc md5_Str*(str: string): string =
|
||||
## Generate MD5 hash for a string. Result is a 32 character
|
||||
@@ -819,8 +819,8 @@ proc md5_Str*(str: string): string =
|
||||
discard md5_Update(ctx, input[i].addr, cast[csize_t](L))
|
||||
i += L
|
||||
|
||||
discard md5_Final(addr res, ctx)
|
||||
result = hexStr(addr res)
|
||||
discard md5_Final(cast[cstring](addr res), ctx)
|
||||
result = hexStr(cast[cstring](addr res))
|
||||
|
||||
when defined(nimHasStyleChecks):
|
||||
{.pop.}
|
||||
|
||||
@@ -58,7 +58,7 @@ proc launchSwarm(name: ptr SockAddr) {.async.} =
|
||||
16384, cast[ptr SockAddr](addr saddr),
|
||||
addr slen)
|
||||
size = 0
|
||||
var grammString = $cstring(addr buffer)
|
||||
var grammString = $cast[cstring](addr buffer)
|
||||
if grammString == message:
|
||||
saveSendingPort(sockport)
|
||||
inc(recvCount)
|
||||
@@ -80,7 +80,7 @@ proc readMessages(server: AsyncFD) {.async.} =
|
||||
16384, cast[ptr SockAddr](addr(saddr)),
|
||||
addr(slen))
|
||||
size = 0
|
||||
var grammString = $cstring(addr buffer)
|
||||
var grammString = $cast[cstring](addr buffer)
|
||||
if grammString.startsWith("Message ") and
|
||||
saddr.sin_addr.s_addr == nativesockets.ntohl(INADDR_LOOPBACK.uint32):
|
||||
await sendTo(server, addr grammString[0], len(grammString),
|
||||
|
||||
@@ -8,7 +8,7 @@ proc c_sprintf(buf, fmt: cstring) {.importc:"sprintf", header: "<stdio.h>", vara
|
||||
|
||||
proc floatToStr(f: float64): string =
|
||||
var buffer: array[128, char]
|
||||
c_sprintf(addr buffer, "%.16e", f)
|
||||
c_sprintf(cast[cstring](addr buffer), "%.16e", f)
|
||||
result = ""
|
||||
for ch in buffer:
|
||||
if ch == '\0':
|
||||
|
||||
@@ -29,7 +29,7 @@ suite "inet_ntop tests":
|
||||
check: ip4.s_addr == 0x10111213'u32
|
||||
|
||||
var buff: array[0..255, char]
|
||||
let r = inet_ntop(AF_INET, cast[pointer](ip4.s_addr.addr), buff[0].addr, buff.len.int32)
|
||||
let r = inet_ntop(AF_INET, cast[pointer](ip4.s_addr.addr), cast[cstring](buff[0].addr), buff.len.int32)
|
||||
let res = if r == nil: "" else: $r
|
||||
check: res == "19.18.17.16"
|
||||
|
||||
@@ -42,9 +42,9 @@ suite "inet_ntop tests":
|
||||
var ip6 = [0x1000'u16, 0x1001, 0x2000, 0x2001, 0x3000, 0x3001, 0x4000, 0x4001]
|
||||
var buff: array[0..255, char]
|
||||
when defined(zephyr):
|
||||
let r = inet_ntop(AF_INET6, cast[pointer](ip6[0].addr), buff[0].addr, buff.len.int32)
|
||||
let r = inet_ntop(AF_INET6, cast[pointer](ip6[0].addr), cast[cstring](buff[0].addr), buff.len.int32)
|
||||
else:
|
||||
let r = inet_ntop(AF_INET6, ip6[0].addr, buff[0].addr, buff.sizeof.int32)
|
||||
let r = inet_ntop(AF_INET6, ip6[0].addr, cast[cstring](buff[0].addr), buff.sizeof.int32)
|
||||
let res = if r == nil: "" else: $r
|
||||
check: not ipv6Support or res == "10:110:20:120:30:130:40:140"
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ import strutils
|
||||
|
||||
let arr = ['H','e','l','l','o',' ','W','o','r','l','d','!','\0']
|
||||
doAssert $arr == "['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\\x00']"
|
||||
doAssert $cstring(unsafeAddr arr) == "Hello World!"
|
||||
doAssert $cast[cstring](addr arr) == "Hello World!"
|
||||
|
||||
proc takes(c: cstring) =
|
||||
doAssert c == cstring""
|
||||
|
||||
Reference in New Issue
Block a user