AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 779905
Accepted
wangt13
wangt13
Asked: 2024-07-11 08:00:21 +0800 CST2024-07-11 08:00:21 +0800 CST 2024-07-11 08:00:21 +0800 CST

使用 GNU -O2 和 -O3 编译的 C 程序的差异行为

  • 772

我正在开发一个嵌入式Linux系统(5.10.24),其中运行着几个应用程序。

最近,我发现一个 C 程序有些奇怪。
该 C 程序使用了 SDK 库提供的 API,该 SDK 是用 GNU 构建的-O2,但默认情况下该 C 程序是用 GNU 构建的-O3。

然后发现有时(运行数百次中就有一次)C 程序会Segmentation Fault在 SDK 中的某个函数中触发。

如果 C 程序使用与 SDK 相同的 GNU 构建,则在其数千次运行中-O2不会触发此类事件。Segmentation Fault

-O2我在 Google 上搜索了和的区别-O3,发现有人提到这-O3可能会引发奇怪而有趣的错误,是真的吗?

gnu
  • 2 2 个回答
  • 61 Views

2 个回答

  • Voted
  1. Best Answer
    Philip Couling
    2024-07-11T15:58:29+08:002024-07-11T15:58:29+08:00

    一般而言,假设数百万人使用的主流软件运行正常,而您自己刚刚开发并仅供您使用的软件是问题的根源。 在开发人员的职业生涯中,像这样在 GCC 中发现真正的错误是极其罕见的,有点像中彩票。根据组织和用户群的规模以及产品的使用年限,在闭源专有代码中发现错误更为常见。

    优化不会影响预编译的代码,只会影响使用 GCC 编译的代码。

    优化级别是添加一大堆优化标志的简写。您可以单独试验它们,看看哪一个会导致问题。例如-O3:

    -fgcse-after-reload
    -fipa-cp-clone
    -floop-interchange
    -floop-unroll-and-jam
    -fpeel-loops
    -fpredictive-commoning
    -fsplit-loops
    -fsplit-paths
    -ftree-loop-distribution
    -ftree-partial-pre
    -funswitch-loops
    -fvect-cost-model=dynamic
    -fversion-loops-for-strides
    

    通常情况下,代码和 API 之间的优化级别不匹配不会造成问题。调用约定不受影响。在极少数情况下,struct填充可能会错位,但这种情况很少见。

    更常见的是,优化会做以下两件事之一:

    • 在线程代码中,过度优化可能会重新排序代码,使其不再是线程安全的。这通常是由于您(开发人员)未能volatile正确使用诸如 C 之类的关键字造成的。
    • 在所有代码中,较低级别的优化都具有一些额外的保护,这有助于调试代码。这些包括添加具有预定义值的填充,允许调试器发现缓冲区溢出。这样的填充可以防止程序在应该崩溃时完全崩溃。注意,我不认为上述针对-O3over的优化会删除填充-O2。它可能仍会重新排序,使得现有的缓冲区溢出或数组索引错误现在会导致致命错误,而原来不会。

    我没有看到您所读内容的上下文,但总的来说,假设优化代码会触发代码中的错误,而不是编译器中的错误。

    • 3
  2. Artem S. Tashkinov
    2024-07-11T15:13:34+08:002024-07-11T15:13:34+08:00

    这确实是事实,并且可能表明存在 GCC 问题。

    如果您的 SDK 是开源的,并且您使用的是受支持的 GCC 版本之一,则可以提交错误报告。否则,降低优化级别才是最佳选择。

    • 1

相关问题

  • GNU coreutils 需要建议 [关闭]

  • 使用 macOS 版本的拆分包将文件拆分为 4 个块

  • 如何使用 GNU make 部分序列化

  • bsdtar:如何避免覆盖现有文件信息?

  • gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve