哪种方法可以测试乘法时有符号整数溢出?

2024-02-23

以下哪一项以符合标准的方式做了“正确的事”?你可以假设m and n属于类型int(有符号整数)。主要问题是有符号整数溢出。

样本1。

size_t bytes = n * m;
if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
    /* allocate “bytes” space */
}

样本2。

if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
    size_t bytes = n * m;
    /* allocate “bytes” space */
}

样本 3。

if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
    size_t bytes = (size_t)n * (size_t)m;
    /* allocate “bytes” space */
}

我认为他们都错了,但原因却不尽相同。那么什么才是正确的呢?

这些片段摘自here http://randomascii.wordpress.com/2014/04/17/buggy-security-guidance-from-apple/.


编辑强调主要问题是有符号整数相乘,这可能导致未定义的行为(无符号则不会)。

我现在认为,只要整数、有符号整数、size_t 和 SIZE_MAX 具有“通常”值,或者至少它们符合相关标准,最后一个示例就可以正确工作。


1和2是错误的,因为n * m可能会溢出。事实上,您继续将其分配给size_t不会“逆转”溢出。

我认为3是正确的。 (演员阵容m顺便说一句是多余的)。如果有人不同意,请发布示例值m and n and SIZE_MAX这使得测试不正确!

我也看不出以下问题:

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

哪种方法可以测试乘法时有符号整数溢出? 的相关文章

随机推荐

  • 如何在 Chrome 开发工具中显示来自特定域的流量

    我只是想知道是否可以仅在 Chrome 开发工具的 网络 选项卡中显示来自特定域的流量 是的 您可以通过输入domain localhost在过滤框中进行过滤localhost域 例如 Notes 过滤器框具有自动完成功能可以帮助您 这就是
  • 如何将TFLite模型转换为量化TFLite模型?

    我有一个 tflite 文件 我想对其进行量化 如何将TFLite模型转换为量化TFLite模型 请注意 您需要源模型来对其进行量化 由于 tflite 模型格式的限制 无法对其进行量化 您的源模型可以是 TF saving model K
  • 跨版本后缀冲突(sbt、Scala-STM、Play-JSON)

    我使用的 JSON 扩展依赖于 Mandubian 的 play json 2 2 SNAPSHOT 一切都很顺利 直到现在我有了一个基于 Scala STM 的项目 sbt 报告以下问题 error Modules were resolv
  • 在移动设备或桌面导航栏时显示汉堡菜单

    我正在进行移动优先设计 并使用 CSS 和 jQuery 制作了一个我非常喜欢的下拉汉堡菜单 但我想做的是 当页面显示在桌面上时 使该汉堡菜单消失 并替换为常规的水平菜单导航栏 我能够使菜单响应 所以至少有一个水平导航栏可以在桌面上下拉 而
  • css 两行1列框布局

    我一直在使用 Flexbox 进行两行一列布局 我使用 Flexbox 是因为我认为 css2 1 无法填充 box B 的剩余空间 在我的 jsFiddle 示例中 我无法让 box C 在右侧向上移动 也无法让 box B 垂直弯曲并填
  • 无需用户凭据的身份验证

    我正在组建一个个人 React 站点 并希望将请求发送到 AWS API 网关 然而 我只想my site能够提取数据 不会有用户模型 并且我曾经使用过的每个身份验证模型都要求用户通过登录执行某些操作 无论是用户 密码还是 AD 有人可以指
  • android-NestDK 卡住了 pincode

    我正在尝试弄清楚如何将我的 NestDK 应用程序连接到 Nest API 使用我的用户名和密码登录后 我收到 使用此 Pincode 连接 Nest XXXXXX 我该怎么办 我预计 access token 请求会在后台发生 但我卡在了
  • Windows Phone:如何禁用 ScrollViewer(列表框)中的触摸滚动?

    我有一个滚动查看器 里面有一个列表框 我需要通过触摸禁用垂直滚动 我该怎么办 换句话说 用户无法通过触摸滚动 我已经放置了按钮 但这是另一个故事
  • Flutter:自定义单选按钮

    How can I create a custom radio button group like this in flutter 这是完整的代码 class CustomRadio extends StatefulWidget overr
  • JDO 异常:“查询需要 1 个参数,但已提供 2 个值。”

    尽管我的 JDO 查询包含TWO declareParameters语句 下面的代码产生一个错误 声称只接受一个参数 查询需要 1 个参数 但已提供 2 个值 这两个参数是amountP and taxP javax jdo Query q
  • 为什么我会收到此 SQL/DB 错误?

    我正在尝试使用 DB2 运行一个简单的 SQL 语句 但遇到了一些问题 我希望在 txt db2 文件中有一个脚本 并让引擎处理所有命令 这是脚本 CONNECT TO MYDB CREATE TABLE PERSONS PID SMALL
  • 垫选择内的模板出口不起作用

    我试图在带有 template outlet 的 mat select 中传递 tmp 但无法显示选择选项 下面是我的代码和 stackblitz 的链接
  • 无法在 IE 中通过 AJAX 更改会话变量

    当我尝试使用 AJAX 更改服务器上的会话变量时 IE 出现一些奇怪的行为 它在 FF Chrome Safari 和我测试过的所有其他浏览器中运行良好 但在 IE 中运行不佳 我在会话变量中为匿名用户维护一个变量 整数 列表 这样我就可以
  • 我可以将 Android 项目中的资源标记为已弃用吗?

    我有一个 android 库 我想将其某些资源标记为已弃用 可绘制对象 尺寸 持续时间 我在某处读到可以将 deprecated deprecated 添加到资源定义中 但它似乎没有做任何事情 在 Android R 中 您可以看到诸如 j
  • 设置 Newtonsoft.Json.JsonConvert 的比较器以用于 HashSet/Dictionary

    我有一个HashSet
  • 使用新的 Firebase 在 Heroku 上为 ElasticSearch 设置 Flashlight

    我的目标是将 Firebase 与 ElasticSearch 连接起来进行索引 以便我可以在 iOS 应用程序中搜索用户名时实现 like 查询 据我所知 这是最好的解决方案 我想尽早以这种方式解决它 以便可扩展 而不是暴力破解 为了实现
  • android 如何处理相机意图

    我正在 Android 中研究一些相机的东西 我得到了一些教程 根据我的需要 我使用以下代码 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE C
  • 使用查询字符串预填充 github 新问题表单

    有没有办法获得新 git 问题的链接 该问题预先填充标签以及标签的分配字段以及查询字符串中指定的用户 我的用例是 我想要一个可以提供给测试人员的链接 以确保他们为我的功能选择正确的标签 并且还将 git 问题分配给我 我发现格式是
  • 在Python中设置分区

    我有一个数组 1 2 3 我想使用数组的所有元素进行所有可能的组合 Result 1 2 3 1 2 3 1 2 3 1 3 2 1 2 3 既然这个好问题又被复活了 这里有一个新的答案 问题是递归解决的 如果你已经有一个分区n 1元素 你
  • 哪种方法可以测试乘法时有符号整数溢出?

    以下哪一项以符合标准的方式做了 正确的事 你可以假设m and n属于类型int 有符号整数 主要问题是有符号整数溢出 样本1 size t bytes n m if n gt 0 m gt 0 SIZE MAX n gt m alloca