[lttng-dev] lttng-ust with --std=c99 -pedantic

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Jun 18 10:11:56 EDT 2012


* John Steele Scott (toojays at toojays.net) wrote:
> On 13/06/12 01:25, Mathieu Desnoyers wrote:
> > * Mathieu Desnoyers (mathieu.desnoyers at efficios.com) wrote:
> >> Hi John,
> >>
> >> * John Steele Scott (toojays at toojays.net) wrote:
> >>> I want to add lttng-ust tracepoints to a program which builds with "--std=c99 -pedantic". Right now this does not work.
> >>>
> >>> Using the demo program as an example, if you enable --std=c99, the first issue looks like:
> >>>
> >>> jscott at saaz:~/src/lttng-ust/tests/demo$ ccache gcc -std=c99 -DHAVE_CONFIG_H -I. -I../.. -I../../include/lttng  -I../../include -Wall -g -O2 -MT demo.o -MD -MP -MF .deps/demo.Tpo -c -o demo.o demo.c
> >>> In file included from demo.c:34:0:
> >>> ust_tests_demo.h: In function ‘__tracepoint_cb_ust_tests_demo___starting’:
> >>> ust_tests_demo.h:27:23: warning: implicit declaration of function ‘typeof’ [-Wimplicit-function-declaration]
> >>> ust_tests_demo.h:27:218: error: expected ‘;’ before ‘_________p1’
> >>> ust_tests_demo.h:27:395: error: ‘_________p1’ undeclared (first use in this function)
> >>> ust_tests_demo.h:27:395: note: each undeclared identifier is reported only once for each function it appears in
> >>> In file included from demo.c:34:0:
> >>> ust_tests_demo.h: In function ‘__tracepoint_cb_ust_tests_demo___done’:
> >>> ust_tests_demo.h:35:214: error: expected ‘;’ before ‘_________p1’
> >>> ust_tests_demo.h:35:383: error: ‘_________p1’ undeclared (first use in this function)
> >>> In file included from demo.c:35:0:
> >>> ust_tests_demo2.h: In function ‘__tracepoint_cb_ust_tests_demo2___loop’:
> >>> ust_tests_demo2.h:27:299: error: expected ‘;’ before ‘_________p1’
> >>> ust_tests_demo2.h:27:470: error: ‘_________p1’ undeclared (first use in this function)
> >>> In file included from demo.c:36:0:
> >>> ust_tests_demo3.h: In function ‘__tracepoint_cb_ust_tests_demo3___done’:
> >>> ust_tests_demo3.h:27:215: error: expected ‘;’ before ‘_________p1’
> >>> ust_tests_demo3.h:27:386: error: ‘_________p1’ undeclared (first use in this function)
> >>>
> >>> This can be easily resolved by using __typeof__() instead of typeof(). Then I can build with --std=c99. But adding -pedantic still fails:
> >> I pushed a fix for this:
> >>
> >> commit 6423c3134bf07d4a7db56f69f2c79b540a79c4f1
> >> Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >> Date:   Mon Jun 11 10:15:25 2012 -0400
> >>
> >>     Fix c99 compatibility: use __typeof__ instead of typeof in public headers
> >>     
> >>     Reported-by: John Steele Scott <toojays at toojays.net>
> >>     Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >>
> >> I also had issues with (void) arg parameters with tracepoints, so
> >> pushed:
> >>
> >> commit 4495dd39c05739d0fb2bc463b7c093d2459ce2b6
> >> Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >> Date:   Tue Jun 12 11:22:46 2012 -0400
> >>
> >>     Fix: support -std=c99 in tracepoint macros
> >>     
> >>     Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >>
> >> I had also to fix userspace RCU library, with:
> >>
> >>
> >> commit e51500edbd9919cee53bc85cbb4b22cd4786fc42
> >> Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >> Date:   Tue Jun 12 11:24:31 2012 -0400
> >>
> >>     Fix c99 compatibility: use __asm__ and __volatile__ in public headers
> >>     
> >>     Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >>
> >> commit bdffa73aa208ad5f1e5b3a3cb6cbf86ac6996559
> >> Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >> Date:   Mon Jun 11 10:16:35 2012 -0400
> >>
> >>     Fix c99 compatibility: use __typeof__ instead of typeof in public headers
> >>     
> >>     Reported-by: John Steele Scott <toojays at toojays.net>
> >>     Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> >>
> >>
> >>> jscott at saaz:~/src/lttng-ust/tests/demo$ ccache gcc -std=c99 -Dtypeof=__typeof__ -pedantic -DHAVE_CONFIG_H -I. -I../.. -I../../include/lttng  -I../../include -Wall -g -O2 -MT demo.o -MD -MP -MF .deps/demo.Tpo -c -o demo.o demo.c
> >>> In file included from ust_tests_demo.h:25:0,
> >>>                  from demo.c:34:
> >>> ../../include/lttng/tracepoint.h: In function ‘__tracepoints__init’:
> >>> ../../include/lttng/tracepoint.h:251:4: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> ../../include/lttng/tracepoint.h:255:4: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> ../../include/lttng/tracepoint.h:260:4: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> ../../include/lttng/tracepoint.h:264:4: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> ../../include/lttng/tracepoint.h:268:4: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> In file included from demo.c:34:0:
> >>> ust_tests_demo.h: In function ‘__tracepoint_cb_ust_tests_demo___starting’:
> >>> ust_tests_demo.h:27:161: warning: ISO C forbids braced-groups within expressions [-pedantic]
> >>> ust_tests_demo.h:27:549: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> In file included from demo.c:34:0:
> >>> ust_tests_demo.h: In function ‘__tracepoint_cb_ust_tests_demo___done’:
> >>> ust_tests_demo.h:35:161: warning: ISO C forbids braced-groups within expressions [-pedantic]
> >>> ust_tests_demo.h:35:537: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> In file included from demo.c:35:0:
> >>> ust_tests_demo2.h: In function ‘__tracepoint_cb_ust_tests_demo2___loop’:
> >>> ust_tests_demo2.h:27:245: warning: ISO C forbids braced-groups within expressions [-pedantic]
> >>> ust_tests_demo2.h:27:624: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >>> In file included from demo.c:36:0:
> >>> ust_tests_demo3.h: In function ‘__tracepoint_cb_ust_tests_demo3___done’:
> >>> ust_tests_demo3.h:27:161: warning: ISO C forbids braced-groups within expressions [-pedantic]
> >>> ust_tests_demo3.h:27:540: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
> >> I see these warnings, the only thing that currently fails is due to
> >> BYTE_ORDER and BIG_ENDIAN not being defined. By adding:
> >>
> >> -DBYTE_ORDER=__BYTE_ORDER -DBIG_ENDIAN=__BIG_ENDIAN
> >>
> >> my tests/hello program, with a Makefile.am modified to do:
> >>
> >> hello_CFLAGS = -Werror=old-style-definition --std=c99 -pedantic
> >>
> >> prints many pedantic warnings, and fails with:
> >>
> >> ././ust_tests_hello.h:55:1: error: zero or negative size array ‘__event_fields___ust_tests_hello___tptest_sighandler’
> >>
> >> which seems to be caused by my event with 0 fields, which try to create
> >> an array of length 0.
> >>
> >> I'll look into this one.
> > Please try again with lttng-ust master HEAD, userspace-rcu master HEAD,
> > and let me know if you experience problems compiling your instrumented
> > application with --std=c99 -pedantic. Please note that the probe object
> > (e.g. tp.c in the tests/hello program) needs to be compiled with gnu
> > extensions, so you should not use --std=c99 for this specific object.
> 
> Mathieu,
> 
> Thanks for your reply, sorry it has taken me so long to respond.
> 
> I can now build this application with userspace tracing. I was
> actually able to compile the probe object with --std=c99 as well (this
> time on Centos 6.2, didn't try yet on Ubuntu). Would you expect any
> problems from this? I only have a single tracepoint in this app, but
> it does seem to work.

--std=c99 will not work to compile probes containing tracepoints taking
0 arguments. This is because c99 does not allow 0-sized arrays, and I
don't want to complexify the probe generation to take care of this
issue.

> 
> The thing I forgot to mention is: okay, I can build now with
> -pedantic, but I can't build with "-pedantic -Werror". This
> application builds with "--std=c99 -pedantic -Werror" (among many
> other flags). I can of course remove -Werror for my tests, but in the
> longer term I would like to see lttng-ust enabled in our regular
> build, and disabling -Werror for that is not something we want to do.
> If I only had to disable it for the trace provider, I could negotiate
> that, but disabling it for any module which uses tracepoints is
> undesirable.
> 
> I haven't yet looked at how difficult it would be do eliminate these
> pedantic warnings. Do you have a feel for what is involved?
> Preprocessor tricks warp my mind. :(

I don't think we'll want to make the lttng probe module build under
--std=c99 -pedandic -Werror, but I think we should focus on making sure
the tracepoint part that is built within the application (with
TRACEPOINT_CREATE_PROBES _not_ defined) builds fine in --std=c99
-pedantic.

Currently, building a simple test program with tracepoints under
--std=c99 -pedantic gets me:


In file included from ust_tests_hello.h:25:0,
                 from hello.c:34:
../../include/lttng/tracepoint.h: In function ‘__tracepoints__init’:
../../include/lttng/tracepoint.h:261:3: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
../../include/lttng/tracepoint.h:265:3: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
../../include/lttng/tracepoint.h:270:3: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
../../include/lttng/tracepoint.h:274:3: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
../../include/lttng/tracepoint.h:278:3: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]

---> see include/lttng/tracepoint.h __tracepoints__init():
----> This is caused by use of dlsym() to lookup a function pointer from
      a symbol. dlsym() returns "void *", and we cast it into function
      pointer type. Ideas on how to make this c99 pedantic compliant are
      welcome.

------------------

In file included from hello.c:34:0:
ust_tests_hello.h: In function ‘__tracepoint_cb_ust_tests_hello___tptest’:
ust_tests_hello.h:28:1: warning: ISO C forbids braced-groups within expressions [-pedantic]
ust_tests_hello.h:28:1: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]
ust_tests_hello.h: In function ‘__tracepoint_cb_ust_tests_hello___tptest_sighandler’:
ust_tests_hello.h:52:1: warning: ISO C forbids braced-groups within expressions [-pedantic]
ust_tests_hello.h:52:1: warning: ISO C forbids conversion of object pointer to function pointer type [-pedantic]

---> see include/lttng/tracepoint.h 

#define _DECLARE_TRACEPOINT(_provider, _name, ...)                                      \
extern struct tracepoint __tracepoint_##_provider##___##_name;                          \
static inline void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \
[...]

----> this is caused by use of "tp_rcu_dereference_bp()", which is
defined in include/lttng/tracepoint-rcu.h (in the #else clause) :

#define tp_rcu_dereference_bp(p)                                             \
        ({                                                                   \
                __typeof__(p) _________p1 = URCU_FORCE_CAST(__typeof__(p),   \
                        tracepoint_dlopen.rcu_dereference_sym_bp(URCU_FORCE_CAST(void *, p))); \
                (_________p1);                                               \
        })

For this one, we should be able to change it into a single-expression
and remove the braced-groups, since we are just really evaluating a
single expression here. Fixed by the following commit in lttng-ust
master:

commit a4eaf8eabe829be8f7d7432ffaf83291a068b0ed
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date:   Mon Jun 18 10:10:36 2012 -0400

    Fix c99 compatibility: tp_rcu_dereference_bp() should not use braced-groups within expressions

------------------

hello.c: In function ‘inthandler’:
hello.c:39:47: warning: ISO C99 requires rest arguments to be used [enabled by default]
---> see include/lttng/tracepoint.h  tracepoint() macro.
----> this is caused by not passing any argument to the tracepoint.
Ideas on how to fix this are welcome, as I don't see any way to do it in
C99-pedantic.

Thanks!

Mathieu



> 
> cheers,
> 
> John
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list