abort() is not portable -- it behaves differently on different systems. 
A segfault is portable, so we use have used it for 20 years now, and it
works fine.  Use abort() at your own risk.

On 3/4/19 8:35 AM, Gary R. Schmidt wrote:
> On 2019-03-01 23:00, Kern Sibbald wrote:
>> Hello,
>>
>> I am quite surprised that the static function did not take precedence. 
>> In any case, I have changed the subroutine name to be bround(), and will
>> push it to the git rep this evening.
>>
>> Thanks for pointing this out,
>> Kern
>>
> I agree, it's strange that the "static" didn't hide it, but the G++
> developers often do strange things.
>
> Anyway, as threatened, here are my results building with the Solaris
> Developer Studio C++ compiler:
>
> Using Developer Studio 12.6.
>
> Firstly, the code compiles much more quietly than previously, the
> recent clean-up has certainly improved things.
>
> And the problem with "round()" did not happen...
>
> Sections are divided by lines of ='s.
>
> ==================================================================
> This warning is repeated for every file that includes src/config.h.
>
> Compiling attr.c
> /src/bacula/bacula-9.4.2/libtool  --tag=CXX --mode=compile
> /opt/developerstudio12.6/bin/CC   -c   -I. -I..  -g -O -m64   attr.c
> libtool: compile:  /opt/developerstudio12.6/bin/CC -c -I. -I.. -g -O
> -m64 attr.c  -KPIC -DPIC -o .libs/attr.o
> "../config.h", line 1266: Warning (Anachronism): Attempt to redefine
> __restrict__ without using #undef.
> 1 Warning(s) detected.
>
> Examining the source, it is for a very old version of the Solaris C++
> compiler, I would suggest changing lines 1255-1266 in
> autoconf/config.h.in:
>
> $ diff -c original-bacula-9.4.2/autoconf/config.h.in
> bacula-9.4.2/autoconf/config.h.in
> *** original-bacula-9.4.2/autoconf/config.h.in  Mon Mar  4 18:06:07 2019
> --- bacula-9.4.2/autoconf/config.h.in   Mon Mar  4 18:11:18 2019
> ***************
> *** 1255,1266 ****
>      nothing if this is not supported.  Do not define if restrict is
>      supported directly.  */
>   #undef restrict
> ! /* Work around a bug in Sun C++: it does not support _Restrict or
>      __restrict__, even though the corresponding Sun C compiler ends
> up with
>      "#define restrict _Restrict" or "#define restrict __restrict__"
> in the
>      previous line.  Perhaps some future version of Sun C++ will work
> with
>      restrict; if so, hopefully it defines __RESTRICT like Sun C
> does.  */
> ! #if defined __SUNPRO_CC && !defined __RESTRICT
>   # define _Restrict
>   # define __restrict__
>   #endif
> --- 1255,1266 ----
>      nothing if this is not supported.  Do not define if restrict is
>      supported directly.  */
>   #undef restrict
> ! /* Work around a bug in old Sun C++: it does not support _Restrict or
>      __restrict__, even though the corresponding Sun C compiler ends
> up with
>      "#define restrict _Restrict" or "#define restrict __restrict__"
> in the
>      previous line.  Perhaps some future version of Sun C++ will work
> with
>      restrict; if so, hopefully it defines __RESTRICT like Sun C
> does.  */
> ! #if defined __SUNPRO_CC && __SUNPRO_CC < 0x5150
>   # define _Restrict
>   # define __restrict__
>   #endif
>
> This behaviour probably changed in Sun C++ several versions ago, but
> the noise generated prior to the recent clean-up masked it.
>
> ==================================================================
>
> After applying the above change, things get a lot quieter!
>
> Subsequent warnings fall into two basic groups.
>
> ==================================================================
>
> Group 1:
>
> "../baconfig.h", line 64: Warning: Likely null pointer dereference
> (*(((char *)0)[0])): bRC_BXATTR BXATTR::serialize_xattr_stream
>
> This looks like old C code used to cause a segmentation violation when
> something has gone wrong.
> I wonder why "abort()" was/is not used?
>
> What happens if you replace the assignments like "tjcr[0] = 0;" with
> "abort();"????
> The code compiles, but does it still do what is expected??  (Yes, I am
> sure that it does, and some of the lines are even documented with
> "generate segmentation violation" but just because I'm paranoid it
> doesn't mean they aren't out to get me!)
>
> There are three files affected:
>     src/baconfig.h
>     src/lib/lockmgr.c
>     src/lib/message.c
>
> $ diff -c -r original-bacula-9.4.2/src/baconfig.h
> bacula-9.4.2/src/baconfig.h
> *** original-bacula-9.4.2/src/baconfig.h    Tue Feb  5 03:47:31 2019
> --- bacula-9.4.2/src/baconfig.h    Mon Mar  4 17:15:58 2019
> ***************
> *** 61,67 ****
>      char *tjcr = NULL; \
>      Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
>      Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
> !    tjcr[0] = 0; }
>
>   #define ASSERT2(x,y) if (!(x)) { \
>      set_assert_msg(__FILE__, __LINE__, y); \
> --- 61,67 ----
>      char *tjcr = NULL; \
>      Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
>      Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
> !    abort(); }
>
>   #define ASSERT2(x,y) if (!(x)) { \
>      set_assert_msg(__FILE__, __LINE__, y); \
> ***************
> *** 68,74 ****
>      Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
>      Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
>      char *tjcr = NULL; \
> !    tjcr[0] = 0; }
>   #else
>   #define ASSERT(x)
>   #define ASSERT2(x, y)
> --- 68,74 ----
>      Emsg1(M_ERROR, 0, _("Failed ASSERT: %s\n"), #x); \
>      Pmsg1(000, _("Failed ASSERT: %s\n"), #x); \
>      char *tjcr = NULL; \
> !    abort(); }
>   #else
>   #define ASSERT(x)
>   #define ASSERT2(x, y)
>
> $ diff -c -r original-bacula-9.4.2/src/lib/lockmgr.c
> bacula-9.4.2/src/lib/lockmgr.c
> *** original-bacula-9.4.2/src/lib/lockmgr.c    Tue Feb  5 03:47:31 2019
> --- bacula-9.4.2/src/lib/lockmgr.c    Mon Mar  4 17:19:06 2019
> ***************
> *** 53,70 ****
>   #define ASSERT(x) if (!(x)) { \
>      char *jcr = NULL; \
>      Pmsg3(000, _("ASSERT failed at %s:%i: %s\n"), __FILE__, __LINE__,
> #x); \
> !    jcr[0] = 0; }
>
>   #define ASSERT_p(x,f,l) if (!(x)) {              \
>      char *jcr = NULL; \
>      Pmsg3(000, _("ASSERT failed at %s:%i: %s \n"), f, l, #x); \
> !    jcr[0] = 0; }
>
>   #define ASSERT2_p(x,m,f,l) if (!(x)) {          \
>      char *jcr = NULL; \
>      set_assert_msg(f, l, m); \
>      Pmsg4(000, _("ASSERT failed at %s:%i: %s (%s)\n"), f, l, #x,
> m);        \
> !    jcr[0] = 0; }
>
>   /* for lockmgr unit tests we have to clean up developer flags and
> asserts which breaks our tests */
>   #ifdef TEST_PROGRAM
> --- 53,70 ----
>   #define ASSERT(x) if (!(x)) { \
>      char *jcr = NULL; \
>      Pmsg3(000, _("ASSERT failed at %s:%i: %s\n"), __FILE__, __LINE__,
> #x); \
> !    abort(); }
>
>   #define ASSERT_p(x,f,l) if (!(x)) {              \
>      char *jcr = NULL; \
>      Pmsg3(000, _("ASSERT failed at %s:%i: %s \n"), f, l, #x); \
> !    abort(); }
>
>   #define ASSERT2_p(x,m,f,l) if (!(x)) {          \
>      char *jcr = NULL; \
>      set_assert_msg(f, l, m); \
>      Pmsg4(000, _("ASSERT failed at %s:%i: %s (%s)\n"), f, l, #x,
> m);        \
> !    abort(); }
>
>   /* for lockmgr unit tests we have to clean up developer flags and
> asserts which breaks our tests */
>   #ifdef TEST_PROGRAM
>
> $ diff -c -r original-bacula-9.4.2/src/lib/message.c
> bacula-9.4.2/src/lib/message.c
> *** original-bacula-9.4.2/src/lib/message.c    Tue Feb  5 03:47:31 2019
> --- bacula-9.4.2/src/lib/message.c    Mon Mar  4 17:17:12 2019
> ***************
> *** 1413,1419 ****
>
>       if (type == M_ABORT) {
>          char *p = 0;
> !        p[0] = 0;                      /* generate segmentation
> violation */
>       }
>       if (type == M_ERROR_TERM) {
>          exit(1);
> --- 1413,1419 ----
>
>       if (type == M_ABORT) {
>          char *p = 0;
> !        abort();                      /* generate segmentation
> violation */
>       }
>       if (type == M_ERROR_TERM) {
>          exit(1);
> ***************
> *** 1551,1557 ****
>          char *p = 0;
>          printf("Bacula forced SEG FAULT to obtain traceback.\n");
>          syslog(LOG_DAEMON|LOG_ERR, "Bacula forced SEG FAULT to obtain
> traceback.\n");
> !        p[0] = 0;                      /* generate segmentation
> violation */
>       }
>       if (type == M_ERROR_TERM) {
>          exit(1);
> --- 1551,1557 ----
>          char *p = 0;
>          printf("Bacula forced SEG FAULT to obtain traceback.\n");
>          syslog(LOG_DAEMON|LOG_ERR, "Bacula forced SEG FAULT to obtain
> traceback.\n");
> !        abort();                      /* generate segmentation
> violation */
>       }
>       if (type == M_ERROR_TERM) {
>          exit(1);
>
> ==================================================================
>
> Group 2:
>
> The bane of C++ coding, what happens when you have declarations mixed
> in with definitions?
>
> "../lib/cmd_parser.h", line 92: Warning: args hides cmd_parser::args.
> "../stored/aligned_dev.h", line 139: Warning:
> aligned_dev::get_full_addr hides the virtual function
> DEVICE::get_full_addr(unsigned, unsigned).
>
> The G++ developers appear to consider this benign, which it is,
> except, of course, when it isn't.
>
> These warnings can be switched off by adding
> "-erroff=wvarhidemem,hidevf" to CFLAGS, but I don't like to do that.
>
> ==================================================================
>
> Of the above three sets of problems, the __SUNPRO_CC guard code can be
> safely changed:
> #if defined __SUNPRO_CC && __SUNPRO_CC < 0x5150
>
> I am confident that using abort() will not change the behaviour of the
> code, but I'll let that mull for while, and see what Kern et al think.
>
> I dislike hiding warnings or errors, so I will not be doing this.
>
>     Cheers,
>         Gary    B-)
>
>
>
> _______________________________________________
> Bacula-devel mailing list
> bacula-de...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/bacula-devel



_______________________________________________
Bacula-users mailing list
Bacula-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bacula-users

Reply via email to