On 05/10/2018 15:33, Daniel Hellstrom wrote:
On 2018-10-05 14:01, Sebastian Huber wrote:
On 05/10/2018 13:43, Daniel Hellstrom wrote:
On 2018-10-05 13:01, Sebastian Huber wrote:
On 05/10/2018 12:44, Daniel Hellstrom wrote:

On 2018-10-05 09:41, Sebastian Huber wrote:
On 05/10/2018 09:38, Daniel Hellstrom wrote:

On 2018-10-05 09:34, Sebastian Huber wrote:
On 05/10/2018 09:25, Daniel Hellstrom wrote:
On 2018-10-05 09:12, Sebastian Huber wrote:
On 05/10/2018 08:57, Daniel Hellstrom wrote:
This fixes the following test failures on LEON3 UP/SMP when
built using clang compiler:
  * fsjffs2gc01
  * jffs2_fserror
  * jffs2_fspermission
  * jffs2_fsrdwr
  * jffs2_fstime

The problem is probably in the rbtree_postorder_for_each_entry_safe(). Coverity Scan has also an issue with this macro. It is on my todo list. Please do not check in this patch.
Ok I will not push it. Yes I was also thinking so. To use offsetof() macro could be an option maybe, however the node type input is not known to the rbtree_postorder_for_each_entry_safe() function even though it only used from jffs2 code.

The Linux code uses typeof. We could do this also:

diff --git a/cpukit/include/linux/rbtree.h b/cpukit/include/linux/rbtree.h
index 53c777e8c1..8fc575240f 100644
--- a/cpukit/include/linux/rbtree.h
+++ b/cpukit/include/linux/rbtree.h
@@ -126,12 +126,12 @@ static inline struct rb_node *rb_parent( struct rb_node *node )
   for ( \
     node = _RBTree_Postorder_first( \
       (RBTree_Control *) root, \
-      (size_t) ( (char *) &node->field - (char *) node ) \
+      offsetof( __typeof__( *node ), field ) \
     ); \
     node != NULL && ( \
       next = _RBTree_Postorder_next( \
         &node->field, \
-        (size_t) ( (char *) &node->field - (char *) node ) \
+        offsetof( __typeof__( *node ), field ) \
       ), \
       node != NULL \
     ); \

It shouldn't be a big problem since at least GCC and clang supports it. It is also a standard C++ operator. It is already used in

cpukit/libfs/src/jffs2/include/linux/list.h

Ok, I will give it a try.


Thanks, please try this patch:

https://lists.rtems.org/pipermail/devel/2018-October/023181.html

Yes I can confirm it fixed all the 5 tests on gr712rc with clang. It also removed the two warnings in jffs2 code related.

I have updated my patch to only include the third warning fix then:

---
 cpukit/libfs/src/jffs2/src/readinode.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cpukit/libfs/src/jffs2/src/readinode.c b/cpukit/libfs/src/jffs2/src/readinode.c
index 519b0d6..ecdf335 100644
--- a/cpukit/libfs/src/jffs2/src/readinode.c
+++ b/cpukit/libfs/src/jffs2/src/readinode.c
@@ -35,7 +35,7 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info
     struct jffs2_raw_node_ref *ref = tn->fn->raw;
     int err = 0, pointed = 0;
     struct jffs2_eraseblock *jeb;
-    unsigned char *buffer;
+    unsigned char *buffer = NULL;
     uint32_t crc, ofs, len;
     size_t retlen;

What is this for a warning? Some sort of uninitialized variable warning? This code is identical to the Linux upstream. This is probably a clang bug.

buffer will never be uninitialized from what I see, so yes maybe its a clang bug. This is the warning:


sparc-gaisler-rtems5-clang --pipe -DHAVE_CONFIG_H   -I.. -I/home/daniel/git/rtems/rcc-1.3/rtems/build/gr712rc_drvmgr_test_up/sparc-gaisler-rtems5/c/gr712rc/include -I/home/daniel/git/rtems/rcc-1.3/rtems/kernel/cpukit/include -I/home/daniel/git/rtems/rcc-1.3/rtems/kernel/cpukit/score/cpu/sparc/include -I/home/daniel/git/rtems/rcc-1.3/rtems/kernel/cpukit/libnetworking -I/home/daniel/git/rtems/rcc-1.3/rtems/kernel/c/src/../../cpukit/libfs/src/jffs2/include -Wno-pointer-sign -mcpu=gr712rc -O2 -g -ffunction-sections -fdata-sections -Wall -Wmissing-prototypes -Wimplicit-function-declaration -Wstrict-prototypes -Wnested-externs -MT src/jffs2/src/libjffs2_a-readinode.o -MD -MP -MF src/jffs2/src/.deps/libjffs2_a-readinode.Tpo -c -o src/jffs2/src/libjffs2_a-readinode.o `test -f 'src/jffs2/src/readinode.c' || echo '/home/daniel/git/rtems/rcc-1.3/rtems/kernel/c/src/../../cpukit/libfs/'`src/jffs2/src/readinode.c /home/daniel/git/rtems/rcc-1.3/rtems/kernel/c/src/../../cpukit/libfs/src/jffs2/src/readinode.c:80:6: warning: variable 'buffer' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
        if (!pointed) {
            ^~~~~~~~

We have

int pointed = 0;

and the address of pointed is not taken, so this condition will be always true. I am not sure what the constraints of the -Wsometimes-uninitialized warnings are. Maybe they should trigger in case code modifications elsewhere might lead to the offending condition. Coverity Scan doesn't complain about this one.

Please have a look at this patch:

https://lists.rtems.org/pipermail/devel/2018-October/023190.html

In contrast to the buffer = NULL initialization this patch entirely avoids the problematic path which must the compiler follow to deduces this warning.

It works too, the size and disassembly is the same in both cases with clang (optimizations is turned on though). Apart from the code getting harder to read, I believe it would break if __ECOS would be undefined since pointed is used then. Maybe an #errror or an assert within the #ifndef __ECOS should be added to signal that the code would break otherwise.

Thanks for testing. If you undefine __ECOS a lot more things will break. If you use the buffer = NULL initialization and a new generation of static analysis tools starts to look at cyg_crc32_accumulate() it will notice undefined behaviour again.

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to