I posted a patch to fix Bug 2789 but it's orthogonal to this issue. We should still see if we can come up with a compile-time-only circumvention.
On Wed, Dec 21, 2016 at 12:30 PM, Maxim Uvarov <maxim.uva...@linaro.org> wrote: > On 12/21/16 19:07, Bill Fischofer wrote: >> On Wed, Dec 21, 2016 at 9:58 AM, Mike Holmes <mike.hol...@linaro.org> wrote: >>> On 21 December 2016 at 10:49, Maxim Uvarov <maxim.uva...@linaro.org> wrote: >>> >>>> 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. >> >> I agree that this is a bit of a kludge. I'm currently debugging Bug >> 2789 where things fail if CONFIG_PACKET_MAX_SEG > 2. I'd like to see >> if the fix for that doesn't result in a cleaner implementation in this >> area that may not expose this issue. >> > > btw, compilation fails only with -O2 or -O3 and -O0 compiles. > > Maxim. > > >>>> >>>> >>>> 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. >>>> >>>> >>>> >>> Perhaps we need to just add a comment then - possibly a doxygen one maybe >>> a @note ? >>> So that anyone editing in future will not re break it by mistake, they >>> might not test on a legacy compiler >>> >>> >>>> >>>> >>>>> >>>>> >>>>> 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" >>>>> >>>>> __ >>>>> >>>>> >>>> >>>> >>> >>> >>> -- >>> 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" >