为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器?

2023-12-25

我在一本书上读到这样一句话:

事实证明,构建一个可以实际执行的编译器是不可能的 确定 C++ 函数是否会更改 a 的值 特定变量。

该段落讨论了为什么编译器在检查常量性时是保守的。

为什么不可能构建这样的编译器?

编译器始终可以检查变量是否被重新分配,是否正在对其调用非常量函数,或者是否作为非常量参数传入......


为什么不可能构建这样的编译器?

出于同样的原因,您无法编写一个程序来确定任何给定程序是否将终止。这被称为停止问题 http://en.wikipedia.org/wiki/Halting_problem,这是不可计算的事情之一。

需要明确的是,您可以编写一个编译器来确定函数确实更改了变量在某些情况下,但是您无法编写一个可靠地告诉您该函数将或不会更改每个可能函数的变量(或停止)的代码。

这是一个简单的例子:

void foo() {
    if (bar() == 0) this->a = 1;
}

编译器如何仅通过查看该代码来确定是否foo将会永远改变a?是否执行取决于函数外部的条件,即执行bar。证明停止问题不可计算的证据还不止这些,但在链接的维基百科文章(以及每本计算理论教科书)中已经很好地解释了它,所以我不会尝试在这里正确解释它。

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

为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器? 的相关文章

  • 哪些 iomanip 操纵器具有“粘性”?

    我最近在创建一个stringstream由于我错误地假设std setw 会影响每次插入的字符串流 直到我明确更改它 然而 插入后它总是被取消设置 With timestruct with value of Oct 7 9 04 AM st
  • .Net Core 中 String 默认不可序列化吗?

    我正在查看其他的 Fortify 静态分析安全测试 SAST 扫描报告 以识别和抑制误报 应用程序框架是C NET Core SAST 报告部分内容如下 Method1 在第 111 行将不可序列化的对象存储为 HttpSessionSta
  • 除了第一列之外,Gridview 行可点击?

    我使用以下代码使 gridview 的整行可单击 protected void gridMSDS RowDataBound object sender GridViewRowEventArgs e if e Row RowType Data
  • Ruby 解释器嵌入到 C 代码中

    我只是尝试书中的一个简单例子 我有一个 sum rb 文件 class Summer def sum max raise Invalid maximum max if max lt 0 max max max 2 end end 还有一个
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 混合 VS2012 平台工具集

    我们正在从 VS2005 切换到 VS2012 update 2 我们正在构建大量 主要是控制台 本机 C 无 MFC ATL 可执行文件 它们使用几个常见的静态链接库 这些可执行文件主要在 Win7 计算机上运行 但有些也部署在较旧的 X
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • 通过 Nuke.Common/NuGet.CommandLine 部署 NuGet 包时如何通过 Azure Auth

    我正在尝试通过 Azure DevOps 上的 Nuke 和 CI CD 自动执行 NuGet 包更新 一切都构建得很好 但在 PushNuGet 步骤中 该过程尝试通过弹出窗口向 Azure 进行身份验证 这显然从未在 in devops
  • XPath 选择具有特定属性值的元素?

    我在使用 XPath 选择节点时遇到问题 我将展示一个示例 由于实际数据量很大 xml 文件被缩短了 这是 XML 的子集
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • 当“多次安装 MSBuild”时,Dotnet 项目转换尝试转换失败

    try convert w Test csproj target framework netstandard2 0 结果是 Multiple installs of MSBuild detected please select one In
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • STL 向量、迭代器和插入 (C++)

    我有一个将向量的迭代器传递到的方法 在这个方法中 我想向向量中添加一些元素 但我不确定当只有迭代器时这是否可行 void GUIComponentText AddAttributes vector
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • MsBuild 在 Visual Studio Online 上找不到恢复的 NuGet 包

    我尝试构建一个存储在 Visual Studio Online 上的外部 GIT 存储库中的解决方案 它有以下步骤 1 Git 恢复 有效 2 NuGet 恢复 有效 3 构建 不起作用 查看日志时我的第一个猜测是 MsBuild 没有查找
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind

随机推荐

  • Android 共享首选项不起作用

    我有一项服务 其中有4个全局静态int变量我有一个启动完成和呼叫事件的接收器 我想做的是每当执行 Call 事件接收器时保存这 4 个变量 并在执行 BOOT 接收器时检索它们 当然当我重新启动手机时 但两者都不起作用 另一件事设备重新启动
  • Powershell使用ODBC DSN而不是连接字符串从数据库读取

    我知道如何使用连接字符串从数据库读取值 即 建立数据库连接进行读取 conn New Object System Data SqlClient SqlConnection conn ConnectionString Server 10 10
  • GitHub Pages:如何将文本环绕在图像周围?

    我有一个 GitHub 博客页面 在博客页面中间的某个位置 我有一张图像 其中显示了以下 Markdown 内容 My Image pathto myimage png 这可以很好地显示图像 但我还想添加一个段落 包裹在图像的右侧 来描述图
  • bigquery 使用嵌套字段进行旋转

    我有一个带有架构的 bigquery 表 我想要这样的结果 flow timestamp channel name number of digits 2019 10 31 15 31 15 channel name 1 3 2019 10
  • Azure AD 在有效访问令牌上返回 Authentication_ExpiredToken

    我越来越Your access token has expired Please renew it before submitting the request 当我打电话时https graph windows net myorganiza
  • frisby 的 Get 方法不适用于 https

    我是弗里斯比测试的新手 今天发现无法访问https ip https ip来自 friby api 的地址 例如 frisby create my test get https 199 59 148 20 output connect er
  • Eclipse/MySQL 集成插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我的顺风滚动 snap x 无法工作,您能找到解决方案吗?

    所以我使用 Tailwind CSS 但遇到了问题 所以我正在学习如何在顺风 CSS 上进行滚动捕捉 滚动对齐 y 有效 但滚动对齐 x 不起作用 我尝试了一切让我的代码滚动 snap x 但它不起作用 你们中的任何人都可以修复我的顺风代码
  • 霍夫变换 C# 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 让我们看一下这个 C 实现 https github com andrewkirillov AForge NET blob a9453
  • iOS 中自定义 UIStatusBar

    有没有办法自定义UIStatusBar class 有关可以使用状态栏 或围绕状态栏 执行的操作的示例 请查看此 Github 项目 https github com myell0w MTStatusBarOverlay https git
  • 枚举构造函数(创建成员的成员)

    在 D 中 我试图创建一个成员有成员的枚举 我可以通过一个例子更好地解释我想要做什么 其中s and i代表我试图创建的子成员 在Python中 我可以这样做 class Foo enum Enum A A string 0 B B str
  • 在 VSCode 中禁用 Javascript 的特定错误消息?

    我在 JavaScript 中使用类属性 静态和普通 和装饰器 有没有办法启用其他 ES 阶段的代码突出显示或禁用它们的特定错误消息 VSCode 告诉我只能在 TypeScript 中使用类属性 因此它似乎可以识别它们 您可以使用以下命令
  • 如何给java足够的时间给变量赋值? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个循环 在循环的末尾有一个String 被添加到ArrayList 在类中声明而不是方法 并在循环开始时说Stri
  • 如何发出数据流已完成的信号?

    我有一个类 它使用 TPL 数据流实现由 3 个步骤组成的数据流 在构造函数中 我将步骤创建为 TransformBlocks 并使用 LinkTo 将它们链接起来 并将 DataflowLinkOptions PropagateCompl
  • 在 PHP 7.4 中使用 FFI 加载库时出现问题

    我在新的 FFI 中使用 PHP 中的第三方 so 库时遇到问题 当我运行这段小代码时
  • 如何获取asp.net下拉列表的选定值并将其存储在会话变量中?

    Dim ename As String DropDownList SelectedItem Value 这个声明不起作用 任何帮助表示赞赏 我不确定这是否是您的问题 但如果您正在寻找所需的项目文本 而不是值 DropDownList Sel
  • 使用 Jquery 从第一个下拉列表中过滤第二个下拉列表

    Team 我有两个下拉菜单说 年 和 节 1 年份下拉菜单将有以下选项 显示全部 1 2 3 4 2 部分下拉菜单将有以下选项 所有部分 1 部分 A 1 部分 B 1 部分 C 2 部分 A 2 部分 B 3 部分 A 4 部分 A 4
  • 强制用户在 iOS 中以编程方式更新应用程序

    在我的 iOS 应用程序中 我启用了强制应用程序更新功能 是这样的 如果有严重的错误修复 在服务器中我们正在设置新的发行版本 在启动屏幕中 我正在检查当前的应用程序版本 如果它低于服务版本 则会显示一条更新应用程序的消息 我放置了 2 个按
  • Spring RestTemplate - 需要释放连接吗?

    这是我的 Rest 模板配置 Bean Qualifier myRestService public RestTemplate createRestTemplate Value connection timeout String maxCo
  • 为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器?

    我在一本书上读到这样一句话 事实证明 构建一个可以实际执行的编译器是不可能的 确定 C 函数是否会更改 a 的值 特定变量 该段落讨论了为什么编译器在检查常量性时是保守的 为什么不可能构建这样的编译器 编译器始终可以检查变量是否被重新分配