如何检测难以捉摸的 64 位可移植性问题?

2023-12-30

我在我为 64 位端口准备的一些 (C++) 代码中发现了与此类似的片段。

int n;
size_t pos, npos;

/* ... initialization ... */

while((pos = find(ch, start)) != npos)
{
    /* ... advance start position ... */

    n++; // this will overflow if the loop iterates too many times
}

虽然我严重怀疑这实际上会在内存密集型应用程序中引起问题,但从理论的角度来看还是值得考虑的,因为类似的错误可能会出现will造成问题。 (改变n to a short在上面的示例中,即使是小文件也可能溢出计数器。)

Static analysis tools are useful, but they can't detect this kind of error directly. (Not yet, anyway.) The counter n doesn't participate in the while expression at all, so this isn't as simple as other loops (where typecasting errors give the error away). Any tool would need to determine that the loop would execute more than 231 times, but that means it needs to be able to estimate how many times the expression (pos = find(ch, start)) != npos will evaluate as true—no small feat! Even if a tool could determine that the loop could execute more than 231 times (say, because it recognizes the find function is working on a string), how could it know that the loop won't execute more than 264 times, overflowing a size_t value, too?

显然,要最终识别和修复此类错误需要人眼,但是是否有模式可以泄露此类错误以便可以手动检查?存在哪些类似的错误需要我注意?

EDIT 1: Since short, int and long类型本质上是有问题的,可以通过检查这些类型的每个实例来发现这种错误。然而,鉴于它们在遗留 C++ 代码中无处不在,我不确定这对于大型软件是否实用。还有什么会导致这个错误?是每个while循环可能会出现类似这样的某种错误? (for循环当然不能幸免!)如果我们不处理像这样的 16 位类型,这种错误有多严重short?

EDIT 2:这是另一个示例,显示此错误如何出现在for loop.

int i = 0;
for (iter = c.begin(); iter != c.end(); iter++, i++)
{
    /* ... */
}

从根本上讲,这是相同的问题:循环依赖于某些从不直接与更广泛的类型交互的变量。该变量仍然可能溢出,但没有编译器或工具检测到转换错误。 (严格来说,没有。)

EDIT 3:我正在使用的代码是very大的。 (仅 C++ 就有 10-1500 万行代码。)检查所有这些代码是不可行的,因此我对自动识别此类问题(即使它会导致很高的误报率)的方法特别感兴趣。


代码审查。让一群聪明人查看代码。

Use of short, int, or long是一个警告标志,因为标准中没有定义这些类型的范围。大多数用法应该更改为新的int_fastN_t输入<stdint.h>,处理序列化的用法intN_t。嗯,其实这些<stdint.h>类型应该用于typedef新的特定于应用程序的类型。

这个例子确实应该是:

typedef int_fast32_t linecount_appt;
linecount_appt n;

这表达了行数适合 32 位的设计假设,并且如果设计要求发生变化,也可以轻松修复代码。

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

如何检测难以捉摸的 64 位可移植性问题? 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 动态计算字段中的字符数

    我想动态计算表单文本区域字段中的字符 我知道有一个类似的问题 但我想知道它是否可以从某个数字向 0 计数 例如在 Twitter 上写推文时 这段代码可以是 javascript PHP 这对我来说并不重要 这应该可以帮助你 这里有一个tu
  • 如何让discord.py 机器人向非作者的人发送私人/直接消息?

    假设我想制作一个具有 poke 功能的机器人 又名当有人说 poke user 0000 时向用户发送一条说 Boop 的消息 我该怎么做 当我这样做时它工作得很好 bot command pass context True async d
  • 无法读取用户的字符[重复]

    这个问题在这里已经有答案了 在这段代码中 我正在创建一个二叉树 直到用户想要节点数 但是在从用户获取输入时 它在某个地方失败了 struct node createTree struct node root int n char ch st
  • 如何使用 PHP 和 GD 解决字体花饰问题

    我有以下代码可以在图像上打印文本 我还在文本周围添加了一个调试框 然而 我注意到左侧的文本位于 PHP 给我的框之外imagettfbbox 这看起来像是字体花饰的问题 有什么办法可以解释这一点吗 我能算出斜盘起点和实际位置之间的距离吗im
  • 为什么在使用此 xpath 语法时会收到已弃用的警告?

    我正在使用 selenium 打印网页上的所有产品链接 这是我的代码 from selenium webdriver import Chrome driver path PATH r C Users David Desktop Seleni
  • 如何在android中使用sqlite连接表

    我试图找出如何在 Android 应用程序中使用 sqlite 数据库在我的两个表上进行简单的表连接 使用 CursorJoiner 是最简单的方法还是有更简单的方法 在实施中SQLite数据库 http android git kerne
  • Angular CLI 6 未知选项:“--singleRun”

    当我想执行测试时 我可以选择 single run已激活 但升级到 Angular 6 后不再被识别 gt ng test source map false single run no progress browsers ChromeNoS
  • PHP 无法通过 COM 打开 Excel 工作簿

    该代码工作正常 直到到达打开的工作簿行 然后失败
  • 如何创建扩展方法 (F#)? [复制]

    这个问题在这里已经有答案了 如何在 F 中创建扩展方法 例如 如下 C 扩展 public static string Right this string host int index return host Substring host
  • 将 HTML 分成页面,分割长段落

    好吧 我什至不确定这是否可以用我当前的方法来完成 我正在尝试将 HTML 文档的内容放入当前视口大小的页面中 我目前正在通过迭代文档的所有元素并检查它们的顶部偏移量是否在当前页面的边界内来执行此操作 只要不在当前页面的边界内 此偏移量就会成
  • Typescript:是否有一种简单的方法将一种类型的对象数组转换为另一种类型

    所以 我有两节课 Item name string desc string meta string ViewItem name string desc string hidden boolean 我有一个 Item 数组需要转换为 View
  • 实体方面(春季)

    我在定义我的方面时遇到了一些问题 我有一堆实体 我想在其中分析 get methods 所以我编写了以下切入点和方法 Pointcut execution tld myproject data entities get public voi
  • 在运行时创建/修改枚举

    我正在创建一个程序 用户可以选择创建自己的自定义属性 这些属性最终将显示在PropertyGrid 现在我不想搞乱自定义编辑器 所以我只允许原始类型属性 string int double DateTime bool等 PropertyGr
  • 无闪烁文本框

    我的表单上有一个简单的 Winforms 多行文本框 每当我调整文本框的大小或移动文本框时 它的内容就会开始疯狂地闪烁 这看起来非常恶心 甚至可能导致某些用户癫痫发作 有没有办法操纵文本框的重绘过程来消除闪烁 我找到了一个工作解决方案 ht
  • 连接到 SQL Server 2008 的最大并发用户数

    连接到 SQL Server 2008 的最大并发用户数是否有限制 我猜测计算机资源决定了该限制 如果存在 但我也想知道是否存在理论上的限制 我尝试用谷歌搜索答案 但我找到的所有信息都是基于 SQL Server 的早期版本 如果有限制 它
  • 如何在 ASP.NET Core 中重写 HandleUnauthorizedRequest

    我正在将项目迁移到 asp net core 但我一直在迁移控制器的自定义授权属性 这是我的代码 public class CustomAuthorization AuthorizeAttribute public string Url g
  • 采用 {ID}-{Slug} 格式的 ASP.NET MVC 路由约束

    我有一条如下所示的路线 理想情况下我希望它匹配 domain com layout 1 slug is the name of the page routes MapRoute Layout Route name layout id slu
  • C# 7.0 中的泛型函数和 ref 返回

    是否可以使用 C 7 0 中的 ref returns 功能定义一个通用函数 该函数可以对对象的两个实例中的字段进行比较和更新 我正在想象这样的事情 void UpdateIfChanged
  • avconv:根据图像的子集制作视频

    我正在尝试使用 avconv 将一堆 png 制作成视频 png 的编号如下filename
  • 如何检测难以捉摸的 64 位可移植性问题?

    我在我为 64 位端口准备的一些 C 代码中发现了与此类似的片段 int n size t pos npos initialization while pos find ch start npos advance start positio