On 12/21/16 18:31, Mike Holmes wrote: > > > On 21 December 2016 at 10:26, Maxim Uvarov <maxim.uva...@linaro.org > <mailto:maxim.uva...@linaro.org>> wrote: > > On debian jessie gcc unable to compile current code > with error: > odp_packet.c: In function 'odp_packet_trunc_head': > odp_packet.c:314:46: error: array subscript is above array bounds > [-Werror=array-bounds] > to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + i].len; > > The problem is that it breaks compilation only on .len line: > for (i = 0; i < num; i++) { > to->buf_hdr.seg[i].hdr = from->buf_hdr.seg[num + i].hdr; > to->buf_hdr.seg[i].data = from->buf_hdr.seg[num + i].data; > to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + i].len; > } > > If that line is commented out compilation passes. If lines are reordered > than compilation also passes. Because there is no warning on .hdr > and .data > it looks like compiler error. Additional check for preconfigured value > is workaround to that situation. > > Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org > <mailto:maxim.uva...@linaro.org>> > --- > platform/linux-generic/odp_packet.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/platform/linux-generic/odp_packet.c > b/platform/linux-generic/odp_packet.c > index 0d3fd05..f3e0a12 100644 > --- a/platform/linux-generic/odp_packet.c > +++ b/platform/linux-generic/odp_packet.c > @@ -309,6 +309,8 @@ static inline void > copy_num_segs(odp_packet_hdr_t *to, odp_packet_hdr_t *from, > int i; > > for (i = 0; i < num; i++) { > + if (odp_unlikely((num + i) >= CONFIG_PACKET_MAX_SEGS)) > + ODP_ABORT("packet segmenation error\n"); > > > Does this impact performance, if so should it be optionally compiled in > for that GCC version ? >
CONFIG_PACKET_MAX_SEG is currently 2. And according to our tests it will add one if check for odp_packet_trunc_head() and odp_packet_trunc_tail() calls. So overhead is one if instruction. It fails on Jessie, which is: # gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --with-arch-32=i586 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.9.2 (Debian 4.9.2-10) And passes on my Ubuntu which is (4.8 or 4.9): gcc-4.9 -v Using built-in specs. COLLECT_GCC=gcc-4.9 COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.3-0ubuntu4' --with-bugurl=file:///usr/share/doc/gccgo-4.9/README.Bugs --enable-languages=c,c++,go --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --disable-libquadmath --enable-plugin --with-system-zlib --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.9.3 (Ubuntu 4.9.3-0ubuntu4) And for arm it looks like it failed with some 5.x gcc version. So it might be not easy to define exactly which version is it. > > > to->buf_hdr.seg[i].hdr = from->buf_hdr.seg[num + > i].hdr; > to->buf_hdr.seg[i].data = from->buf_hdr.seg[num + > i].data; > to->buf_hdr.seg[i].len = from->buf_hdr.seg[num + > i].len; > -- > 2.7.1.250.gff4ea60 > > > > > -- > Mike Holmes > Program Manager - Linaro Networking Group > Linaro.org <http://www.linaro.org/>* **│ *Open source software for ARM SoCs > "Work should be fun and collaborative, the rest follows" > > __ > >