for 循环中的隐式内存别名

2024-01-27

我正在使用 golangci-lint 并且在以下代码中收到错误:

versions []ObjectDescription
... (populate versions) ...

for i, v := range versions {
    res := createWorkerFor(&v)
    ...

}

错误是:

G601: Implicit memory aliasing in for loop. (gosec)
                     res := createWorkerFor(&v)
                                            ^

“for 循环中的隐式内存别名”到底是什么意思?我在 golangci-lint 文档中找不到任何错误描述。我不明白这个错误。


简而言之,该警告意味着您正在获取循环变量的地址。

发生这种情况是因为在for声明 https://golang.org/ref/spec#For_statements迭代变量被重用。在每次迭代时,范围表达式中的下一个元素的值被分配给迭代变量;v不会改变,只是它的值改变。因此,表达式&v指的是内存中的同一位置。

以下代码将相同的内存地址打印四次:

for _, n := range []int{1, 2, 3, 4} {
    fmt.Printf("%p\n", &n)
}

当您存储迭代变量的地址时,或者当您在循环内的闭包中使用它时,当您取消引用指针时,其值可能已更改。静态分析工具将检测到这一点并发出您看到的警告。

防止该问题的常见方法有:

  • 索引范围切片/数组/映射。这采用第 i 个位置的实际元素的地址,而不是迭代变量
for i := range versions {
    res := createWorkerFor(&versions[i])
}
  • 在循环内重新分配迭代变量
for _, v := range versions {
    v := v
    res := createWorkerFor(&v) // this is now the address of the inner v
}
  • 对于闭包,将迭代变量作为参数传递给闭包
for _, v := range versions { 
    go func(arg ObjectDescription) {
        x := &arg // safe
    }(v)
}

如果您在循环内按顺序取消引用并且您确定没有任何内容泄漏指针,则您可能会忽略此检查。然而,linter 的工作正是报告代码模式could导致问题,所以无论如何解决它是个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for 循环中的隐式内存别名 的相关文章

  • 如何获取文件的 ctime、atime、mtime 并更改它们

    如何使用 Go 获取文件的 ctime mtime atime 并更改它们 在 Go 1 1 2 中 os Stat只能获取mtime os Chtimes 可以更改 mtime 和 atime 但不能更改 ctime Linux ctim
  • 如何使用 go web 服务器提供静态 html 文件?

    如何使用 go web 服务器提供 index html 或其他静态 HTML 文件 我只想要一个基本的静态 HTML 文件 例如一篇文章 我可以从 Go Web 服务器提供该文件 HTML 应该可以在 go 程序之外进行修改 就像使用 H
  • Go 编程 - 使用指针绕过访问权限

    假设我的项目有以下层次结构 fragment fragment go main go 并且在fragment go我有以下代码 只有一个 getter 没有 setter package fragment type Fragment str
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • go 中的属性更改通知

    如何在 go 中向多个接收器发出 属性 更改信号 类似于在 Qt 中使用通知信号定义属性的方式 例如 如果您想象有一些值需要以多种方式显示 例如进度值可以同时显示为进度条和文本 当基础值发生变化时 两者都需要更新 一种方法可能是利用chan
  • 如何在 Visual Studio Code 中为 Golang 启用竞争检测器?

    我搜索了很多网页来找到我应该放入哪个短语settings json在 VS Code Golang 扩展 由 Microsoft 发布 中添加构建标志 在我的例子中是竞赛检测器 I added go buildFlags race 在扩展名
  • 优化 golang 中的数据结构/字对齐填充

    与我在 C 中学到的类似 我相信填充导致了两个结构体实例大小的差异 type Foo struct w byte 1 byte x byte 1 byte y uint64 8 bytes type Bar struct x byte 1
  • 如何在 Go 中表示可选字符串?

    我希望建模一个可以有两种可能形式的值 不存在或字符串 执行此操作的自然方法是Maybe String or Optional
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter
  • 根据值匹配数组

    我使用以下代码来解析 yaml 并应得到输出为runners对象和函数build应更改数据结构并根据以下结构提供输出 type Exec struct NameVal string Executer string 这是我尝试过的 但我不知道
  • 如何在 Go 中从 stdin 解析无限 json 数组?

    我正在尝试编写一个 i3status 的小替代品 一个与 i3bar 兼容的小程序进行通信this http i3wm org docs i3bar protocol html协议 他们通过标准输入和标准输出交换消息 两个方向的流都是一个无
  • 解释 System.Diagnostics.CodeAnalysis.SuppressMessage

    我在某些应用程序中有这种代码 来自微软 assembly System Diagnostics CodeAnalysis SuppressMessage Microsoft Naming CA1702 CompoundWordsShould

随机推荐

  • Rails 仅在有条件时才验证唯一性

    我有一个问题课 class Question lt ActiveRecord Base attr accessible user id created on validates uniqueness of created on scope
  • 创建自定义文本绘制视图

    我正在为 iPhone 创建一个语法荧光笔 为了显示多种格式的文本 我对 UIView 进行了子类化并修改了drawRect 方法 以便使用正确的语法突出显示显示每一行 突出显示是用 RegEx 提前完成的 文本是用CGContextSho
  • 获取网络浏览器控件的屏幕截图?

    关于这个问题有很多线索 但没有一个是明确的 而且我尝试过的任何一个实际上都没有工作正常 获取整个 Web 浏览器控件的内容 甚至是屏幕外的内容 的代码是什么 看起来他们确实有 webBrowser1 DrawToBitmap but its
  • 跨平台 SSO - 从哪里开始?

    我正在研究两个不同系统之间的单点登录选项 一个 NET 一个 Java EE 它们各自独立管理并具有单独的用户管理 并且存在一些重叠的用户 我希望能够从一个链接到另一个 而无需重新提示输入密码 SSO 产品和协议似乎有很多选择 我相当有信心
  • 如何过滤对象中的数组

    我的对象中有这些数组 我需要filter tags具有特定值的数组 我不知道如何实现这一目标 const obj slug add an aggregate rating feature to your website frontmatte
  • 无法使用 Debian squeeze 在 Sheevaplug (armv5t) 上构建节点

    我现在已经尝试了几种在运行 Debian 版本 6 0 2 squeeze 的 Sheevaplug armv5t 上构建节点 版本 0 5 1 的方法 但最终总是 node Illegal instruction 在所有情况下我都可以编译
  • 处理 ThreadPoolExecutor 的异常

    我有以下代码片段 基本上扫描需要执行的任务列表 然后将每个任务交给执行器执行 The JobExecutor依次创建另一个执行器 用于执行数据库操作 读取数据并将数据写入队列 并完成任务 JobExecutor返回一个Future
  • data.table 在函数中修改后首次调用时不显示[重复]

    这个问题在这里已经有答案了 在我的函数中 我修改作为参数给出的 data table 的列 我注意到 如果我在调用该函数后尝试显示此 data table 我的意思是 仅按其名称 则不会发生任何事情 并且只有后续调用才会显示该表 DT lt
  • 如何使用 CMake 链接 .so 文件 [重复]

    这个问题在这里已经有答案了 我想基于 cpp h 和多个 so 文件重建一个简单的应用程序 据我所见 我的 CMakeLists txt 应该是这样的 cmake minimum required VERSION 3 5 set CMAKE
  • Team Foundation 工作项类型中的产品待办事项列表项和功能之间的区别

    我有关于 Microsoft Team Foundation 的问题 在 Visual Studio 的团队资源管理器中 我可以创建一个新的工作项 此处的工作项类型由您的团队选择的流程模板决定 我不确定我们使用的是哪个流程模板 无论如何 在
  • 使用 numpy 进行高效迭代

    我编写了计算数组 y 的周期 p 中每个元素的平均值的代码 import numpy as np p 4 y np asarray 146 96 59 133 192 127 79 186 272 155 98 219 c len y p
  • JS 错误:元素未附加到文档

    我正在尝试使用将 div 转换为图像html2canvas https html2canvas hertzen com lib 但我不断收到该错误 html2canvas min js 20 Uncaught in promise Erro
  • UNHEX 和 X (MySQL) 之间的区别

    在处理数据库中的十六进制值时 MySQL UNHEX 和 X 之间到底有什么区别 Eg SELECT FROM test WHERE guidCol IN UNHEX hexadecimalstring SELECT FROM test W
  • 为什么不在一个类中编码呢? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 现在我正在学习设计模式 我正在徘徊以下内容 为什么不在 1 个类中编写所有方法 每个方法执行 1 个任务 这样我的客户端就可以访问 1 个文件中
  • 超时的 Haskell 函数[重复]

    这个问题在这里已经有答案了 import Math NumberTheory Primes factorise import System Timeout timeout import Control Monad liftM type Re
  • Twilio 将发布收集的数字及其他详细信息

    我可以通过 twilio 收集的数字发送附加数据吗 我想要实现的是 如果有人发送一条短信说 帮助 我们会致电支持团队并询问他们我们已收到短信 如果他们想与之交谈 请按 1 如果他们按 1 我们将能够拨打我们收到短信的号码 我正在检查 twi
  • Java 中连续“if”语句的简化[重复]

    这个问题在这里已经有答案了 我有一系列if语句 如下图 if board x 1 y true ar 1 if board x y 1 true ar 1 if board x 1 y true ar 1 if board x y 1 tr
  • OpenCV - 如何在拼接图像的对应点之间进行映射

    我正在使用 OpenCV 3 2 并且设置了一个缝合器来缝合两个图像 缝合效果很好 但是一旦完成 我希望能够确定从图像 A 中的点到图像 B 中对应点的映射 我不关心图像在全景图中的布局方式 我只需要能够从 x A y A 图像 A 中的点
  • 从 power bi 公共嵌入中删除共享栏

    我有一份关于 power bi 的报告 已发布在网络上 我将在我的计算机上创建一个本地页面 以通过嵌入代码查看它 并在 Dropbox 上与其他人共享 我想删除带有社交媒体链接的按钮栏以防止共享 我还可以阻止显示 iframe 源链接吗 也
  • for 循环中的隐式内存别名

    我正在使用 golangci lint 并且在以下代码中收到错误 versions ObjectDescription populate versions for i v range versions res createWorkerFor