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"
> 
> __
> 
> 

Reply via email to