C++ 在某些条件下非常奇怪的代码,包括优化
我有一段代码:C++ 在某些条件下非常奇怪的代码,包括优化,c++,c,gcc,optimization,C++,C,Gcc,Optimization,我有一段代码: #include <stdio.h> void optimization_headache() { int t = 11; int l[1047] = {0}; int u_lu[23] = {0}; int u = 0; l[0] = 0; l[1] = 0; do { u++; /
#include <stdio.h>
void optimization_headache()
{
int t = 11;
int l[1047] = {0};
int u_lu[23] = {0};
int u = 0;
l[0] = 0;
l[1] = 0;
do {
u++;
//printf("Incrementing u, now u is %d\n", u);
u_lu[u + 1] = u - l[u + 1];
} while ((u < t * 2) && (l[u + 1] <= t));
printf("u = %d, l[u] = %d, t = %d, u_lu[u] = %d\n", u, l[u], t, u_lu[u]);
}
int main()
{
optimization_headache();
return 0;
}
#包括
void优化
{
int t=11;
int l[1047]={0};
int u_lu[23]={0};
int u=0;
l[0]=0;
l[1]=0;
做{
u++;
//printf(“增加u,现在u是%d\n”,u);
u_lu[u+1]=u-l[u+1];
}而((u
在您的情况下,这是相关部分:
int t = 11;
int u_lu[23] = {0};
do {
u++;
u_lu[u + 1] = u - l[u + 1];
} while ((u < t * 2) /*...*/);
int t=11;
int u_lu[23]={0};
做{
u++;
u_lu[u+1]=u-l[u+1];
}而((u
循环在u
小于22时运行,因此它可以变为21。但是在循环内部,您将u
增加两次,然后写入u\lu[23]
。这比分配的多了一个。这种行为会随着-fno积极的循环优化而消失,这意味着您可能有未定义的行为。有关gcc正在执行的操作的详细说明,请参阅。最有可能发生越界访问。您的代码可以写入u lu[23]
。(您在u<22
时循环,但u
增加两次)@Wimmel噢,我的天哪。我花了这么多时间从一个巨大的纠错库中编辑了这个小示例,只是为了把它发布到这里,我没有足够的脑细胞来仔细查看代码。还有一个事实是,对某些事情进行注释,并使u变得易变,这让我陷入了一个循环。将您的注释作为答案发布,我将继续接受它。如果细微的更改影响了行为,则可能索引超出范围。通过更改没有意义的小事情,首先应该是未定义行为的危险信号:(