在以下代码中:
#include <cstring>
template <unsigned len>
struct CharArray {
CharArray() {
memset(data_, 0, len);
}
char data_[len];
};
struct Foobar {
CharArray<5> a;
CharArray<3> b;
CharArray<0> c;
};
int main() {
Foobar f;
}
该类型CharArray<0>
最终将一个大小为零的数组作为其唯一成员。我知道这通常是 GCC 扩展和不安全的做法。问题不在于那个。
当我使用 gcc 10.2.0 编译代码时,我收到以下警告:
<source>: In function 'int main()':
<source>:5:3: warning: array subscript 8 is outside array bounds of 'Foobar [1]' [-Warray-bounds]
5 | CharArray() {
| ^~~~~~~~~
<source>:18:10: note: while referencing 'f'
18 | Foobar f;
| ^
使用 gcc9 及更早版本没有警告。
问题:下标 8 是从哪里来的?Foobar [1]
那里提到了什么?看起来有一个 Foobars 的数组,我们正在尝试访问该数组中的元素 8。不知道这怎么可能发生。如果有人知道细节,如果您能解释一下,我将不胜感激。
gcc++-10
在 Ubuntu 20.04 中使用-O3 -Wall -Wextra
as 选项编译时会发生这种情况。如果我不通过任何优化标志,则不会有任何警告。另外:如果我把构造函数拿走,警告也会消失。