问题标签 [gcc7]

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 投票
3 回答
4575 浏览

c - gcc7.2:参数范围超过最大对象大小 9..7 [-Werror=alloc-size-larger-than=]

该程序包含如下代码:

下面是用gcc7.2编译时的错误信息:</p>

错误:参数 1 范围 [18446744071562067968、18446744073709551615] 超过最大对象大小 9223372036854775807 [-Werror=alloc-size-larger-than=]

当我更改
int *pi = (int*)calloc(size, sizeof(int));
int *pi = (int*)calloc((unsigned int)size, sizeof(int));

错误消失了。

但是,在程序中,有很多malloccalloc我原来的版本一样使用。

为什么 gcc 只检测到一个错误?

0 投票
2 回答
914 浏览

c - 为什么我使用 fork() 与 valgrind 有不同的输出

我有一个我无法解释的问题。

检查valgrind内存泄漏,我注意到程序打印的顺序与我只运行程序的可执行文件时得到的顺序不同。

我减少了我的程序,以便编译以显示问题所在。

当我编译并运行以下代码时:

我得到以下输出:

但是当我检查它时valgrind,我会以另一个顺序得到输出:

我是 fork 的新手,我不明白这对我来说是否有问题。为什么会发生这种情况?

这是在带有 GCC 7 的 Linux Mint 18.2 上编译的。

0 投票
0 回答
175 浏览

c++11 - nullptr 上的 DW_TAG 未指定类型?

我们有一个使用最新版本的 gcc (g++-7.2) 编译的应用程序 不幸的是,生产服务器很旧并且有一个非常旧的 gdb 版本 (6.5.25-el5rh)

现场调试软件很困难,因为gdb没有显示带有核心文件的回溯。使用 gdb 打开核心文件会导致此消息:

我在http://wiki.dwarfstd.org/index.php?title=C%2B%2B0x:_Null_pointer上找到了nullptr可以翻译成DW_TAG_unspecified_type.

nullptr这个旧版本的 gdb 有问题吗?是否可以要求 gcc 避免为 nullptr 生成侏儒信息?

精度:

  • 我们无法实际更新 gdb 版本,也无法部署我们自己的 gdb 版本
  • 我们依赖于最新版本的 gcc (>= C++11),因此不希望降级 gcc

[local_installation]/generated/bin/g++ -v

CXXFLAGS

问候

0 投票
1 回答
757 浏览

c - 这是在线 C 编译器 gcc-7.2.0 的故障吗?

在一个名为jdoodle的在线 C 编译器上,我尝试了下面这个简单的代码片段:

它打印:

这是我所期望的。

但是当我将代码更改为:

编译器抱怨:

从手册页ceil()来看,它相当简单明了,因为它将double变量作为唯一的参数。

当我将编译器版本从 7.2.0 更改为 5.3.0 时,两个代码都成功编译并生成了预期的输出。

为什么编译器的更新版本抱怨它呢?

如果编译器对它的抱怨是正确的,谁能告诉我为什么ceil(f);会是一段有问题的代码,以至于 gcc-7.2.0 不认为它有效,令人惊讶地将“未定义的引用错误”分配给有效的库函数?

更新:我用 C-GCC6.3 的codechef 在线编译器尝试了相同的代码段,它编译得很好并生成了预期的输出。

0 投票
1 回答
69 浏览

gcc - 如何找到特定次要版本的 GCC 的最新源版本?

我正在为特定目标从源代码构建 GCC。我想使用最新的 GCC 7.2 版本。

当我去官方 GCC FTP GCC FTP时,我只能找到“gcc-7.2.0”版本。

但是,例如,在Arch Linux 存储库中,最新的 GCC 包是“gcc 7.2.1+20180116-1”,我猜是 gcc-7.2.1。

所以,问题是:在哪里可以找到特定次要版本的 GCC 的官方最新源版本?

0 投票
1 回答
1540 浏览

c++ - 不能将包含 math.h 的 C 库与 g++ 7 (Raspberry PI) 一起使用

我已经为 Raspberry PI 构建了 GCC 7.2.0,并使用前缀安装了它/usr/local/gcc-7.2.0(使用本教程)。每当我尝试编译包含 C 库的源代码时,该库又包含math.h我得到奇怪的错误。下面是一个最小的例子:

注意: extern "C"这里是必需的,因为avcodec.h没有它。我确定这不是问题,因为我已尝试将其删除,但仍然出现相同的错误。

用 编译/usr/local/gcc-7.2.0/bin/g++-7.2.0 main.cpp,我得到以下错误:

0 投票
0 回答
622 浏览

c - 是否可以在有或没有“-O0”优化级别的情况下打开 GCC 标志“-Waggressive-loop-optimizations”?

就像标题一样,我想知道是否有办法打开 GCC 标志

当优化级别是-O0或根本不使用-OX时。

让我们看看下面的例子:

如您所见,在i == 4这里:

程序在其边界之外读取数组。

使用以下 GCC 标志编译-O1-O3通知我这一点:

输入:

输出:

但当然它不与-O0.

我正在尝试以下操作:

甚至以下(没有-O0

编译器只是忽略这个标志:

有谁知道为什么会发生这种情况以及是否有可能打开此标志的方法?: -Waggressive-loop-optimizations

编辑

我需要这个,因为例如当我编译上面的程序时:

然后我做:

valgrind 没有报告什么,因为我认为编译器优化了它(我认为):

无论如何,在评论中,对编辑部分和问题本身存在一些误解。

不,我不需要在valgrind这里进行修复,编辑只是为了解释没有捕获超出其边界的访问数组的情况之一,因为该标志-Waggressive-loop-optimizations不像使用优化级别时那样工作-O1-O2或者-O3

0 投票
2 回答
609 浏览

c - 数组迭代中的 CPU 空间缓存局部性

我对 L1 缓存的理解是内存获取会加载缓存行。假设缓存行大小为 64 字节,如果我在 address 访问内存p,它会将整个块从pto加载p + 64到缓存中。因此,最好从左到右(而不是从右到左)遍历数组以最大化缓存局部性。

但是,我编写了示例 C 代码,该代码分配了一个包含 1 亿个字符的数组,将随机值写入其中并求和(复制如下以供参考)。一个版本的代码从左到右求和,另一个从右到左求和。当我对其进行基准测试时,我得到了非常相似的结果(其中“时钟周期”是用 . 来衡量的clock。代码是在没有优化的情况下编译的。

所以我的问题是:现代处理器除了“缓存读取+ 64字节”之外还做其他事情吗?他们是否向前和向后缓存?编译器可以“告诉”处理器代码正在向后迭代吗?

作为参考,我正在Mac OS X 10.13.3使用gcc-7 (Homebrew GCC 7.2.0_1) 7.2.0具有 64 字节缓存行的 x86-64 Intel 处理器运行。

基准测试:

我本来预计前向迭代会快大约 64 倍,因为每 64 个元素应该是缓存命中,而对于后向迭代,每个元素都应该是缓存未命中。

所以,我在上面调用了cachegrind。两者的缓存命中未命中率几乎相同:

代码:

0 投票
1 回答
1374 浏览

c++ - 带有 gcc 7.2 的 std::async 需要 pthread 链接选项

以下代码需要 pthread 链接选项才能编译,我不明白为什么。你有什么主意吗?

我正在使用 gcc 7.2.0

编译

提供以下错误

使用时

没有问题。

这是正常的吗?我错过了什么吗?我的代码在某处没有 pthread_create

0 投票
2 回答
50 浏览

c - 链接列表不会删除列表中的第二 (2) 条记录,但适用于所有其他记录

我真的不明白我的程序会发生什么,因为当我尝试删除链接列表中的任何记录时,它似乎工作正常。

当我尝试删除2它并没有删除它并打印的记录时,问题就出现了0

这是可以验证的工作程序:

输出:

该程序看起来不错,但如果我用它替换int remove = 3;int remove = 2;不起作用,因为我得到:

当预期的输出应该是:

看着Valgrind我注意到我还有一个free

而且我无法弄清楚发生了什么。

这是整个Valgrind报告:

我在 Linux mint 18.3 上GCC-7