[Bug c++/60112] New: bogus error: array subscript is above array bounds
david.abdurachmanov at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Feb 7 21:35:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60112
Bug ID: 60112
Summary: bogus error: array subscript is above array bounds
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: david.abdurachmanov at gmail dot com
GCC pre-4.9.0 (r206686), no issues on 4.6.2, 4.7.2, and 4.8.1. I found that if
I mark `get_size' as inline or constexpr errors are gone. If I keep `nFaces'
uninitialized it also complains, but if I set it explicitly to some number
(e.g., 0,..,<max>) it's fine. Even commenting out such line (49) as
lp += VV(tanDistToFace[iFDest]);
removes the errors.
I tried removing more mass from the test case, but it also removes the errors.
Doesn't work with -O2, but works fine with -O0, -O1, -O3, -Os, and -Og.
### COMPILE ###
c++ -c -O2 -std=c++11 -Werror=array-bounds -fdiagnostics-show-option -fPIC
test2.cpp
### ERRORS ###
test2.cpp: In function 'void abc()':
test2.cpp:43:37: error: array subscript is above array bounds
[-Werror=array-bounds]
iFDestSorted[nDestSorted - i - 1] = iFDestSorted[iMax];
^
test2.cpp:44:22: error: array subscript is above array bounds
[-Werror=array-bounds]
iFDestSorted[iMax] = iTmp;
^
cc1plus: some warnings being treated as errors
### TEST CASE ###
struct GP {
double mx, my, mz;
GP (double x, double y, double z) : mx(x), my(y), mz(z) { };
};
typedef struct GP GP;
void do_something(const GP& n) { }
struct VV {
double mx;
VV (double x) : mx(x) { };
};
typedef struct VV VV;
struct PP {
double mx;
PP (double x) : mx(x) { };
double x() { return mx; };
PP& operator+=(const VV& rhs) { mx += rhs.mx; return *this; };
};
typedef struct PP PP;
int get_size() { return 0; };
void abc() {
double tanDistToFace[6] = {0,0,0,0,0,0};
unsigned int iFDestSorted[6] = {0,0,0,0,0,0};
unsigned int nDestSorted = 0;
unsigned int nFaces = get_size();
for (unsigned int iFace = 0; iFace < nFaces; ++iFace) {
nDestSorted++;
}
for (unsigned int i = 0; i < nDestSorted; ++i) {
unsigned int iMax = nDestSorted - i - 1;
for (unsigned int j=0; j < nDestSorted-i; ++j) {
if (tanDistToFace[iFDestSorted[j]] > tanDistToFace[iFDestSorted[iMax]]) {
iMax = j;
}
}
unsigned int iTmp = iFDestSorted[nDestSorted - i - 1];
iFDestSorted[nDestSorted - i - 1] = iFDestSorted[iMax];
iFDestSorted[iMax] = iTmp;
}
int iFDest = iFDestSorted[0];
PP lp(0);
lp += VV(tanDistToFace[iFDest]);
GP gp(lp.x(), lp.x(), lp.x());
do_something(gp);
}
More information about the Gcc-bugs
mailing list