gpt4 book ai didi

c - 为什么即使在使用 -O0 标志时 clang 也会优化我的数组?

转载 作者:行者123 更新时间:2023-12-03 17:07:18 27 4
gpt4 key购买 nike

我正在尝试使用 GDB 调试以下 C 程序:

// Program to generate a user specified number of 
// fibonacci numbers using variable length arrays
// Chapter 7 Program 8 2013-07-14

#include <stdio.h>

int main(void)
{
int i, numFibs;
printf("How many fibonacci numbers do you want (between 1 and 75)?\n");
scanf("%i", &numFibs);

if (numFibs < 1 || numFibs > 75)
{
printf("Between 1 and 75 remember?\n");
return 1;
}

unsigned long long int fibonacci[numFibs];

fibonacci[0] = 0; // by definition
fibonacci[1] = 1; // by definition

for(i = 2; i < numFibs; i++)
fibonacci[i] = fibonacci[i-2] + fibonacci[i-1];

for(i = 0; i < numFibs; i++)
printf("%llu ", fibonacci[i]);

printf("\n");

return 0;
}

我遇到的问题是在尝试使用以下代码编译代码时: clang -ggdb3 -O0 -Wall -Werror 7_8_FibonacciVarLengthArrays.c

当我尝试在创建的 a.out 文件上运行 gdb 时,我正在逐步执行程序。在 fibonacci[] 数组被 decalared 之后的任何时候,我输入: 信息本地人结果显示 fibonacci <value optimized out> (直到我的 for 循环的第一次迭代之后)然后导致 fibonacci 为程序的其余部分保留地址 0xbffff128(但取消引用该地址似乎不包含任何有意义的数据)。

我只是很困惑,为什么当使用 -O0 标志时 clang 似乎正在优化这个数组?

我可以使用 gcc 来编译这段代码,并且在使用 GDB 时,值会按预期显示....有什么想法吗?

谢谢。

最佳答案

您没有提及您使用的是哪个版本的 clang。我在 3.2 和最近安装的 SVN (3.4) 上都试过了。

这两个版本生成的代码和我看的差不多,就是调试信息不​​一样。当我尝试在 gdb 中检查斐波那契时,clang 3.2(来自默认的 ubuntu 13.04 安装)产生错误:

fibonacci = <error reading variable fibonacci (DWARF-2 expression error: DW_OP_reg operations must be used either alone or in conjunction with DW_OP_piece or DW_OP_bit_piece.)>

用clang 3.4编译的代码,一切正常。在这两种情况下,数组都没有“优化”;它清楚地分配在堆栈上。

所以我怀疑您所看到的奇怪现象与调试信息的发布有关,而不是与实际代码有关。

关于c - 为什么即使在使用 -O0 标志时 clang 也会优化我的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19210697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com