[Bug c/61118] New: Spurious -Wclobbered warning generated by gcc 4.9.0 for pthread_cleanup_push

tavianator at gmail dot com gcc-bugzilla@gcc.gnu.org
Thu May 8 20:45:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61118

            Bug ID: 61118
           Summary: Spurious -Wclobbered warning generated by gcc 4.9.0
                    for pthread_cleanup_push
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tavianator at gmail dot com

Created attachment 32762
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32762&action=edit
Source file

On gcc 4.9.0 (but not on 4.8.2 or earlier), the attached code gives two
spurious warnings:

$ gcc -std=gnu99 -Wclobbered -O2 -c clobber_warning.c -pthread -save-temps
clobber_warning.c: In function ‘dmnsn_future_wait’:
clobber_warning.c:23:54: warning: variable ‘__cancel_routine’ might be
clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
     pthread_cleanup_push(cleanup_fn, &future->mutex);
                                                      ^
clobber_warning.c:23:103: warning: variable ‘__cancel_arg’ might be clobbered
by ‘longjmp’ or ‘vfork’ [-Wclobbered]
     pthread_cleanup_push(cleanup_fn, &future->mutex);

Those variables come from the expansion of the pthread_cleanup_{push,pop}
macros, which look like this (reformatted a little):

do {
  __pthread_unwind_buf_t __cancel_buf;
  void (*__cancel_routine) (void *) = (cleanup_fn);
  void *__cancel_arg = (&future->mutex);
  int __not_first_call = __sigsetjmp ((struct __jmp_buf_tag *) (void *)
__cancel_buf.__cancel_jmp_buf, 0);
  if (__builtin_expect ((__not_first_call), 0)) {
    __cancel_routine (__cancel_arg);
    __pthread_unwind_next (&__cancel_buf);
  }
  __pthread_register_cancel (&__cancel_buf);
  do {;
    pthread_cond_wait(&future->cond, &future->mutex);
    do { } while (0);
  } while (0);
  __pthread_unregister_cancel (&__cancel_buf);
  if (0)
    __cancel_routine (__cancel_arg);
} while (0);

The __cancel_routine and __cancel_arg variables are never modified, so I don't
see how they can be clobbered.


More information about the Gcc-bugs mailing list