问题标签 [gcc8]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
271 浏览

c++ - 当函数中没有返回语句返回非 void 时检测到堆栈粉碎

我一直在调试因错误而中止的程序中的崩溃stack smashing detected。我已将崩溃范围缩小到一个功能,即:

由于我没有在任何地方定义 SOME_FLAG,因此该函数基本上什么都不做,并且在没有返回语句的情况下退出。

我观察到,如果我只是return 0在块外添加一个#ifdef #endif,程序不会中止(由于堆栈粉碎)。如果我将函数定义为static void而不是static ssize_t

缺少 return 语句会导致堆栈保护器触发中止吗?

0 投票
0 回答
493 浏览

c - gcc-8 -Wstringop-truncation - 不一致的行为?

我正在使用 Linux 上的 GCC 8.2.0 和 Cygwin 上的 GCC 8.1.0 编译一些 C 代码(如果确实需要,将提供链接)(后者是自动 CI 构建)。

在 Linux 上,一切正常。在 Cygwin 上,我得到 - 其中包括 - 以下警告:

据我所知,我没有做任何事情,这在两种情况下都会导致不同的编译标志。为什么我只在一种环境中收到警告?会不会是 GCC 版本?

0 投票
2 回答
686 浏览

printf - 我应该如何规避-Wformat-truncation?

假设我有一个函数int *p,我知道它只指向 0 到 99 之间的值。但是,编译器不知道,所以如果我写:

我收到一个警告(至少在 GCC 8.x 上) - 类似于:

我应该如何规避这个警告?

0 投票
1 回答
205 浏览

c++ - 使用带有编译器优化的 std::function 类成员时的段错误

我有一个非常简单的代码示例,-O2在 gcc 8.2.0 下优化时崩溃

也使用-std=c++17,以防万一。

我明白了

而我希望循环运行 10 次迭代。优化级别低于 2 时不会出现此段错误。

上面的例子对我来说看起来是相当无害的代码,据我所知,2 级优化不应该破坏正确的代码。

问题: 我的示例中是否存在未定义的行为或不正确的代码,或者可能是什么问题?

0 投票
0 回答
197 浏览

c++ - 使用选项 -fstack-usage 和 -fdump-rtl-expand 匹配 g++ 生成的文件中的标识符

介绍

我正在尝试对嵌入式程序中最大可能的堆栈使用进行静态评估。我已经设法通过使用 GCC 选项来获取每个单独函数的堆栈使用情况,-fstack-usage并且我已经通过解析 option 生成的 RTL 构建了所有函数调用的树-fdump-rtl-expand

现在,当我为树中的每个函数设置堆栈使用并使用某种 Dijkstra 算法寻找最昂贵的路径时,只剩下简单的部分了。然而,事实证明,从堆栈使用文件中找出哪个函数与 RTL 文件中的哪个函数相关似乎是整个工作中最难的部分。

问题

那么究竟是什么问题呢?

简而言之,GCC为这两个文件生成的函数标识符是不同的。RTL 使用重整的标识符和人类可读的名称。后者与您在源代码中看到的类似。堆栈使用文件只有人类可读的名称,但它们是用一些奇怪的符号编写的,这与 RTL 文件中的完全不同。

让我们看一个例子。

源文件test.cpp

命令(工具链:GCC v8.2.0):

RTL 文件./test.cpp.234r.expand

堆栈使用文件test.su

因此该函数在 RTL 文件和test堆栈使用文件中被命名。_Z4testvvoid test()

当我们从我的代码中得到一些真实的例子时,就更难分辨哪些函数是相同的了。然后名称将是(按顺序):

确定这是否是相同的功能是人类几乎无法做到的,我不知道如何使用脚本/程序来做到这一点。

解决方案建议

理想的解决方案是在堆栈使用文件中使用错误的名称。它们是统一且明确的(除了构造函数和析构函数的一些小烦恼)。

不过,我会接受任何可以可靠地将名称从一个文件匹配到另一个文件的方式。

在最后的手段中,我将被迫按照它们在两个文件中似乎相同的顺序来匹配函数。不过,我很犹豫要不要做出这个假设。

海合会版本

确保为此使用 GCC 版本 8。看起来版本 7 以不同的方式生成名称。我测试了 8.2.0 和 8.3.0 版本。两者都有所描述的行为。

我不能使用版本 7。它有一些错误阻止我的代码编译。


编辑

更多示例

源文件test.cpp

RTL 文件的第一行./test.cpp.234r.expand

堆栈使用文件test.su


编辑2

实验表明,来自 RTL 文件的人类可读标识符不是唯一的。对于重载函数,它们是相同的。

0 投票
2 回答
255 浏览

c++ - 如何估计库函数的使用情况

我正在尝试使用静态分析计算嵌入式程序的最大堆栈使用量。

我使用编译器标志-fstack-usage来获取每个函数的最大堆栈使用量,并使用该标志-fdump-rtl-expand来生成所有函数调用的图表。

最后缺少的成分是内置函数的堆栈使用。(目前只有memset

我想我可以用其他方式测量它并将一个常数放入我的脚本中。但是,我不希望在新版本的 GCC 中内置函数的实现发生变化,而我的脚本中的值保持不变。

也许有一些方法可以用 flag 编译内置函数-fstack-usage?或者其他方式通过静态分析来衡量他们的堆栈使用情况?


编辑:

这个问题不是Stack Size Estimation的重复问题。另一个问题是关于估计整个程序的堆栈使用情况,而我询问如何估计单个内置库函数的堆栈使用情况。另一个问题甚至没有提到内置库函数,也没有提到它的任何答案。

0 投票
0 回答
140 浏览

fedora - 我可以在 Fedora 29 上安装 GCC 4.4.4 或降级我的 Fedora 版本吗?

我有一段代码目前正在 Fedora 13 上编译(我在 VM 上)。我使用 Fedora 29 创建了一个新 VM。问题是 F29 具有 GCC v8.1,而 F13 具有 GCC v4.4.4,因此代码未在 F29 上编译。我发现使用 update-alternatives 可以安装多个 GCC 版本。但是,我无法安装 gcc4。有谁知道,怎么做?或者,我应该使用其他 Fedora 版本吗(因为 F13 不允许我安装 Virtual Box 扩展)。

我正在使用 Virtual Box 6。我不知道,因为我对这一切都很陌生。

0 投票
0 回答
4753 浏览

c++ - 未定义对“运算符删除(无效*,无符号长)”的引用

在 RHEL7 上使用 gcc 8.2 构建我们的 c++ 代码时,我收到了很多对 `operator delete(void*, unsigned long)' 链接错误的未定义引用,之前我们使用 gcc 4.8 进行构建并且构建良好。

链接器错误:未定义对 `operator delete(void*, unsigned long)' 的引用

0 投票
1 回答
242 浏览

c++ - GCC8.2如何启用警告:数组下标高于数组边界[-Warray-bounds]

我想在gcc8.2下启用数组边界检查,这样可以帮助检查编译期间数组下标是否越界,它可能会给出如下警告: array subscript is above array bounds [-Warray-bounds]

我使用coliru做了一个演示:

使用命令编译并运行:

输出如下所示,没有任何警告或错误。

那么gcc8.2支持数组边界检查吗?如何启用它?

编辑:

更进一步,根据第一个答案,如果删除volatilein line volatile A test;,是否可以启用数组边界检查?

谢谢。

0 投票
0 回答
342 浏览

c++ - -Wclass-memaccess 带有 boost::endian 和 gcc 的警告

我得到了一个-Wclass-memaccessgcc >= 8 ,我想知道我是否可以安全地忽略警告。

测试用例:

在魔杖盒上试试

背景:这种类型的代码用于解码二进制网络流量,memcpy 用于安全,具有严格的别名规则。

在更大的代码库上更广泛地使用该模式之前,我想确保它没有缺陷。

我的印象是复制到 boost::endian 缓冲区是安全的。奇怪的是,当缓冲区是指向的指针时没有警告char,但只有当缓冲区是指向的指针时std::byte

完整的警告信息是: