1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

nptl: Change tst-typesizes to _Static_assert

Instead of rely on runtime check to assure correct pthread types
size a better strategy would use _Static_assert to trigger an error
on build time (and thus allowing to check to potentially ABI breakage
on cross-compiling make check).

This patch moves nptl/tst-typesizes.c to libpthread build time on
each specific initialization routine and also remove some runtime
redundant asserts for the same type sizes.

Checked on x86_64-linux-gnu and with a build check for all affected
ABIs (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabihf,
hppa-linux-gnu, i686-linux-gnu, ia64-linux-gnu, m68k-linux-gnu,
microblaze-linux-gnu, mips64-linux-gnu, mips64-n32-linux-gnu,
mips-linux-gnu, powerpc64le-linux-gnu, powerpc-linux-gnu,
s390-linux-gnu, s390x-linux-gnu, sh4-linux-gnu, sparc64-linux-gnu,
sparcv9-linux-gnu, tilegx-linux-gnu, tilegx-linux-gnu-x32,
tilepro-linux-gnu, x86_64-linux-gnu, and x86_64-linux-x32).

	* nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE):
	New macros.
	* nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time
	checks for expected input type size.
	* nptl/pthread_barrier_init.c (__pthread_barrier_init): Likewise.
	* nptl/pthread_barrierattr_init.c (pthread_barrierattr_init):
	Likewise.
	* nptl/pthread_cond_init.c (__pthread_cond_init): Likewise.
	* nptl/pthread_condattr_init.c (__pthread_condattr_init): Likewise.
	* nptl/pthread_mutex_init.c (__pthread_mutex_init): Likewise.
	* nptl/pthread_mutexattr_init.c (__pthread_mutexattr_init): Likewise.
	* nptl/pthread_rwlock_init.c (__pthread_rwlock_init): Likewise.
	* nptl/pthread_rwlockattr_init.c (pthread_rwlockattr_init): Likewise.
	* nptl/sem_init.c (__new_sem_init, __old_sem_init): Likewise
	* nptl/pthread_attr_destroy.c (__pthread_attr_destroy): Remove
	superflous runtime assert check.
	* nptl/pthread_attr_getaffinity.c (__pthread_attr_getaffinity_new):
	Likewise.
	* nptl/pthread_attr_getdetachstate.c (__pthread_attr_getdetachstate):
	Likewise.
	* nptl/pthread_attr_getguardsize.c (pthread_attr_getguardsize):
	Likewise.
	* nptl/pthread_attr_getinheritsched.c (__pthread_attr_getinheritsched):
	Likewise.
	* nptl/pthread_attr_getschedparam.c (__pthread_attr_getschedparam):
	Likewise.
	* nptl/pthread_attr_getschedpolicy.c (__pthread_attr_getschedpolicy):
	Likewise.
	* nptl/pthread_attr_getscope.c (__pthread_attr_getscope): Likewise.
	* nptl/pthread_attr_getstack.c (__pthread_attr_getstack): Likewise.
	* nptl/pthread_attr_getstackaddr.c (__pthread_attr_getstackaddr):
	Likewise.
	* nptl/pthread_attr_getstacksize.c (__pthread_attr_getstacksize):
	Likewise.
	* nptl/pthread_attr_setaffinity.c (__pthread_attr_setaffinity_new):
	Likewise.
	* nptl/pthread_attr_setdetachstate.c (__pthread_attr_setdetachstate):
	Likewise.
	* nptl/pthread_attr_setguardsize.c (pthread_attr_setguardsize):
	Likewise.
	* nptl/pthread_attr_setinheritsched.c
	(__pthread_attr_setinheritsched): Likewise.
	* nptl/pthread_attr_setschedparam.c (__pthread_attr_setschedparam):
	Likewise.
	* nptl/pthread_attr_setschedpolicy.c (__pthread_attr_setschedpolicy):
	Likewise.
	* nptl/pthread_attr_setscope.c (__pthread_attr_setscope): Likewise.
	* nptl/pthread_attr_setstack.c (__pthread_attr_setstack,
	__old_pthread_attr_setstack): Likewise.
	* nptl/pthread_attr_setstackaddr.c (__pthread_attr_setstackaddr):
	Likewise.
	* nptl/pthread_attr_setstacksize.c (__pthread_attr_setstacksize):
	Likewise.
	* nptl/pthread_getattr_default_np.c (pthread_getattr_default_np):
	Likewise.
	* nptl/pthread_mutex_lock.c (__pthread_mutex_lock): Likewise.
	* nptl/pthread_setattr_default_np.c (pthread_setattr_default_np):
	Likewise.
	* nptl/tst-typesizes.c: Remove file.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
Adhemerval Zanella
2017-10-16 12:25:35 -02:00
parent dff91cd45e
commit 72b3c6eecd
37 changed files with 101 additions and 148 deletions

View File

@ -1,5 +1,65 @@
2017-11-07 Adhemerval Zanella <adhemerval.zanella@linaro.org> 2017-11-07 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* nptl/pthreadP.h (ASSERT_TYPE_SIZE, ASSERT_PTHREAD_INTERNAL_SIZE):
New macros.
* nptl/pthread_attr_init.c (__pthread_mutex_init): Add build time
checks for expected input type size.
* nptl/pthread_barrier_init.c (__pthread_barrier_init): Likewise.
* nptl/pthread_barrierattr_init.c (pthread_barrierattr_init):
Likewise.
* nptl/pthread_cond_init.c (__pthread_cond_init): Likewise.
* nptl/pthread_condattr_init.c (__pthread_condattr_init): Likewise.
* nptl/pthread_mutex_init.c (__pthread_mutex_init): Likewise.
* nptl/pthread_mutexattr_init.c (__pthread_mutexattr_init): Likewise.
* nptl/pthread_rwlock_init.c (__pthread_rwlock_init): Likewise.
* nptl/pthread_rwlockattr_init.c (pthread_rwlockattr_init): Likewise.
* nptl/sem_init.c (__new_sem_init, __old_sem_init): Likewise
* nptl/pthread_attr_destroy.c (__pthread_attr_destroy): Remove
superflous runtime assert check.
* nptl/pthread_attr_getaffinity.c (__pthread_attr_getaffinity_new):
Likewise.
* nptl/pthread_attr_getdetachstate.c (__pthread_attr_getdetachstate):
Likewise.
* nptl/pthread_attr_getguardsize.c (pthread_attr_getguardsize):
Likewise.
* nptl/pthread_attr_getinheritsched.c (__pthread_attr_getinheritsched):
Likewise.
* nptl/pthread_attr_getschedparam.c (__pthread_attr_getschedparam):
Likewise.
* nptl/pthread_attr_getschedpolicy.c (__pthread_attr_getschedpolicy):
Likewise.
* nptl/pthread_attr_getscope.c (__pthread_attr_getscope): Likewise.
* nptl/pthread_attr_getstack.c (__pthread_attr_getstack): Likewise.
* nptl/pthread_attr_getstackaddr.c (__pthread_attr_getstackaddr):
Likewise.
* nptl/pthread_attr_getstacksize.c (__pthread_attr_getstacksize):
Likewise.
* nptl/pthread_attr_setaffinity.c (__pthread_attr_setaffinity_new):
Likewise.
* nptl/pthread_attr_setdetachstate.c (__pthread_attr_setdetachstate):
Likewise.
* nptl/pthread_attr_setguardsize.c (pthread_attr_setguardsize):
Likewise.
* nptl/pthread_attr_setinheritsched.c
(__pthread_attr_setinheritsched): Likewise.
* nptl/pthread_attr_setschedparam.c (__pthread_attr_setschedparam):
Likewise.
* nptl/pthread_attr_setschedpolicy.c (__pthread_attr_setschedpolicy):
Likewise.
* nptl/pthread_attr_setscope.c (__pthread_attr_setscope): Likewise.
* nptl/pthread_attr_setstack.c (__pthread_attr_setstack,
__old_pthread_attr_setstack): Likewise.
* nptl/pthread_attr_setstackaddr.c (__pthread_attr_setstackaddr):
Likewise.
* nptl/pthread_attr_setstacksize.c (__pthread_attr_setstacksize):
Likewise.
* nptl/pthread_getattr_default_np.c (pthread_getattr_default_np):
Likewise.
* nptl/pthread_mutex_lock.c (__pthread_mutex_lock): Likewise.
* nptl/pthread_setattr_default_np.c (pthread_setattr_default_np):
Likewise.
* nptl/tst-typesizes.c: Remove file.
* nptl/pthreadP.h (ASSERT_PTHREAD_STRING, * nptl/pthreadP.h (ASSERT_PTHREAD_STRING,
ASSERT_PTHREAD_INTERNAL_OFFSET): New macro. ASSERT_PTHREAD_INTERNAL_OFFSET): New macro.
* nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time * nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time

View File

@ -639,6 +639,14 @@ check_stacksize_attr (size_t st)
return EINVAL; return EINVAL;
} }
#define ASSERT_TYPE_SIZE(type, size) \
_Static_assert (sizeof (type) == size, \
"sizeof (" #type ") != " #size)
#define ASSERT_PTHREAD_INTERNAL_SIZE(type, internal) \
_Static_assert (sizeof ((type) { 0 }).__size >= sizeof (internal), \
"sizeof (" #type ".__size) < sizeof (" #internal ")")
#define ASSERT_PTHREAD_STRING(x) __STRING (x) #define ASSERT_PTHREAD_STRING(x) __STRING (x)
#define ASSERT_PTHREAD_INTERNAL_OFFSET(type, member, offset) \ #define ASSERT_PTHREAD_INTERNAL_OFFSET(type, member, offset) \
_Static_assert (offsetof (type, member) == offset, \ _Static_assert (offsetof (type, member) == offset, \

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
@ -28,7 +27,6 @@ __pthread_attr_destroy (pthread_attr_t *attr)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <pthreadP.h> #include <pthreadP.h>
#include <string.h> #include <string.h>
@ -32,7 +31,6 @@ __pthread_attr_getaffinity_new (const pthread_attr_t *attr, size_t cpusetsize,
{ {
const struct pthread_attr *iattr; const struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (const struct pthread_attr *) attr; iattr = (const struct pthread_attr *) attr;
if (iattr->cpuset != NULL) if (iattr->cpuset != NULL)

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ __pthread_attr_getdetachstate (const pthread_attr_t *attr, int *detachstate)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
*detachstate = (iattr->flags & ATTR_FLAG_DETACHSTATE *detachstate = (iattr->flags & ATTR_FLAG_DETACHSTATE

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ pthread_attr_getguardsize (const pthread_attr_t *attr, size_t *guardsize)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
*guardsize = iattr->guardsize; *guardsize = iattr->guardsize;

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ __pthread_attr_getinheritsched (const pthread_attr_t *attr, int *inherit)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Store the current values. */ /* Store the current values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <string.h> #include <string.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -27,7 +26,6 @@ __pthread_attr_getschedparam (const pthread_attr_t *attr,
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Copy the current values. */ /* Copy the current values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ __pthread_attr_getschedpolicy (const pthread_attr_t *attr, int *policy)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Store the current values. */ /* Store the current values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ __pthread_attr_getscope (const pthread_attr_t *attr, int *scope)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Store the current values. */ /* Store the current values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ __pthread_attr_getstack (const pthread_attr_t *attr, void **stackaddr,
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Store the result. */ /* Store the result. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ __pthread_attr_getstackaddr (const pthread_attr_t *attr, void **stackaddr)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Some code assumes this function to work even if no stack address /* Some code assumes this function to work even if no stack address

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ __pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
size_t size = iattr->stacksize; size_t size = iattr->stacksize;

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
@ -34,12 +33,14 @@ __pthread_attr_init_2_1 (pthread_attr_t *attr)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
ASSERT_TYPE_SIZE (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T);
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_attr_t, struct pthread_attr);
/* Many elements are initialized to zero so let us do it all at /* Many elements are initialized to zero so let us do it all at
once. This also takes care of clearing the bytes which are not once. This also takes care of clearing the bytes which are not
internally used. */ internally used. */
memset (attr, '\0', __SIZEOF_PTHREAD_ATTR_T); memset (attr, '\0', __SIZEOF_PTHREAD_ATTR_T);
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Default guard size specified by the standard. */ /* Default guard size specified by the standard. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include <stdlib.h> #include <stdlib.h>
@ -31,7 +30,6 @@ __pthread_attr_setaffinity_new (pthread_attr_t *attr, size_t cpusetsize,
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
if (cpuset == NULL || cpusetsize == 0) if (cpuset == NULL || cpusetsize == 0)

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ __pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid values. */ /* Catch invalid values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -25,7 +24,6 @@ pthread_attr_setguardsize (pthread_attr_t *attr, size_t guardsize)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Note that we don't round the value here. The standard requires /* Note that we don't round the value here. The standard requires

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ __pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid values. */ /* Catch invalid values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ int
__pthread_attr_setschedparam (pthread_attr_t *attr, __pthread_attr_setschedparam (pthread_attr_t *attr,
const struct sched_param *param) const struct sched_param *param)
{ {
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
struct pthread_attr *iattr = (struct pthread_attr *) attr; struct pthread_attr *iattr = (struct pthread_attr *) attr;
int ret = check_sched_priority_attr (param->sched_priority, int ret = check_sched_priority_attr (param->sched_priority,

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ __pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid values. */ /* Catch invalid values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -26,7 +25,6 @@ __pthread_attr_setscope (pthread_attr_t *attr, int scope)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid values. */ /* Catch invalid values. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -33,7 +32,6 @@ __pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid sizes. */ /* Catch invalid sizes. */
@ -71,7 +69,6 @@ __old_pthread_attr_setstack (pthread_attr_t *attr, void *stackaddr,
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid sizes. */ /* Catch invalid sizes. */

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -30,7 +29,6 @@ __pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr)
EXTRA_PARAM_CHECKS; EXTRA_PARAM_CHECKS;
#endif #endif
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
iattr->stackaddr = stackaddr; iattr->stackaddr = stackaddr;

View File

@ -16,7 +16,6 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include <assert.h>
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include "pthreadP.h" #include "pthreadP.h"
@ -31,7 +30,6 @@ __pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid sizes. */ /* Catch invalid sizes. */
@ -58,7 +56,6 @@ __old_pthread_attr_setstacksize (pthread_attr_t *attr, size_t stacksize)
{ {
struct pthread_attr *iattr; struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr; iattr = (struct pthread_attr *) attr;
/* Catch invalid sizes. */ /* Catch invalid sizes. */

View File

@ -32,6 +32,10 @@ int
__pthread_barrier_init (pthread_barrier_t *barrier, __pthread_barrier_init (pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr, unsigned int count) const pthread_barrierattr_t *attr, unsigned int count)
{ {
ASSERT_TYPE_SIZE (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T);
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_barrier_t,
struct pthread_barrier);
struct pthread_barrier *ibarrier; struct pthread_barrier *ibarrier;
/* XXX EINVAL is not specified by POSIX as a possible error code for COUNT /* XXX EINVAL is not specified by POSIX as a possible error code for COUNT

View File

@ -22,6 +22,10 @@
int int
pthread_barrierattr_init (pthread_barrierattr_t *attr) pthread_barrierattr_init (pthread_barrierattr_t *attr)
{ {
ASSERT_TYPE_SIZE (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T);
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_barrierattr_t,
struct pthread_barrierattr);
((struct pthread_barrierattr *) attr)->pshared = PTHREAD_PROCESS_PRIVATE; ((struct pthread_barrierattr *) attr)->pshared = PTHREAD_PROCESS_PRIVATE;
return 0; return 0;

View File

@ -26,6 +26,8 @@
int int
__pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *cond_attr) __pthread_cond_init (pthread_cond_t *cond, const pthread_condattr_t *cond_attr)
{ {
ASSERT_TYPE_SIZE (pthread_cond_t, __SIZEOF_PTHREAD_COND_T);
struct pthread_condattr *icond_attr = (struct pthread_condattr *) cond_attr; struct pthread_condattr *icond_attr = (struct pthread_condattr *) cond_attr;
memset (cond, 0, sizeof (pthread_cond_t)); memset (cond, 0, sizeof (pthread_cond_t));

View File

@ -23,6 +23,10 @@
int int
__pthread_condattr_init (pthread_condattr_t *attr) __pthread_condattr_init (pthread_condattr_t *attr)
{ {
ASSERT_TYPE_SIZE (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T);
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_condattr_t,
struct pthread_condattr);
struct pthread_condattr *iattr = (struct pthread_condattr *) attr; struct pthread_condattr *iattr = (struct pthread_condattr *) attr;
/* Default is not pshared and CLOCK_REALTIME. */ /* Default is not pshared and CLOCK_REALTIME. */
iattr-> value = CLOCK_REALTIME << 1; iattr-> value = CLOCK_REALTIME << 1;

View File

@ -19,14 +19,12 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <pthreadP.h> #include <pthreadP.h>
#include <assert.h>
int int
pthread_getattr_default_np (pthread_attr_t *out) pthread_getattr_default_np (pthread_attr_t *out)
{ {
struct pthread_attr *real_out; struct pthread_attr *real_out;
assert (sizeof (*out) >= sizeof (struct pthread_attr));
real_out = (struct pthread_attr *) out; real_out = (struct pthread_attr *) out;
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE); lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);

View File

@ -58,7 +58,8 @@ __pthread_mutex_init (pthread_mutex_t *mutex,
{ {
const struct pthread_mutexattr *imutexattr; const struct pthread_mutexattr *imutexattr;
assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T); ASSERT_TYPE_SIZE (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T);
ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers, ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers,
__PTHREAD_MUTEX_NUSERS_OFFSET); __PTHREAD_MUTEX_NUSERS_OFFSET);
ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind, ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind,

View File

@ -62,8 +62,6 @@ static int __pthread_mutex_lock_full (pthread_mutex_t *mutex)
int int
__pthread_mutex_lock (pthread_mutex_t *mutex) __pthread_mutex_lock (pthread_mutex_t *mutex)
{ {
assert (sizeof (mutex->__size) >= sizeof (mutex->__data));
unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex); unsigned int type = PTHREAD_MUTEX_TYPE_ELISION (mutex);
LIBC_PROBE (mutex_entry, 1, mutex); LIBC_PROBE (mutex_entry, 1, mutex);

View File

@ -23,6 +23,10 @@
int int
__pthread_mutexattr_init (pthread_mutexattr_t *attr) __pthread_mutexattr_init (pthread_mutexattr_t *attr)
{ {
ASSERT_TYPE_SIZE (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T);
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_mutexattr_t,
struct pthread_mutexattr);
if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t)) if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t))
memset (attr, '\0', sizeof (*attr)); memset (attr, '\0', sizeof (*attr));

View File

@ -32,6 +32,8 @@ int
__pthread_rwlock_init (pthread_rwlock_t *rwlock, __pthread_rwlock_init (pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr) const pthread_rwlockattr_t *attr)
{ {
ASSERT_TYPE_SIZE (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T);
const struct pthread_rwlockattr *iattr; const struct pthread_rwlockattr *iattr;
iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr; iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr;

View File

@ -22,6 +22,10 @@
int int
pthread_rwlockattr_init (pthread_rwlockattr_t *attr) pthread_rwlockattr_init (pthread_rwlockattr_t *attr)
{ {
ASSERT_TYPE_SIZE (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T);
ASSERT_PTHREAD_INTERNAL_SIZE (pthread_rwlockattr_t,
struct pthread_rwlockattr);
struct pthread_rwlockattr *iattr; struct pthread_rwlockattr *iattr;
iattr = (struct pthread_rwlockattr *) attr; iattr = (struct pthread_rwlockattr *) attr;

View File

@ -19,7 +19,6 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <pthreadP.h> #include <pthreadP.h>
#include <assert.h>
#include <string.h> #include <string.h>
@ -30,7 +29,6 @@ pthread_setattr_default_np (const pthread_attr_t *in)
struct pthread_attr attrs; struct pthread_attr attrs;
int ret; int ret;
assert (sizeof (*in) >= sizeof (struct pthread_attr));
real_in = (struct pthread_attr *) in; real_in = (struct pthread_attr *) in;
/* Catch invalid values. */ /* Catch invalid values. */

View File

@ -27,6 +27,8 @@
int int
__new_sem_init (sem_t *sem, int pshared, unsigned int value) __new_sem_init (sem_t *sem, int pshared, unsigned int value)
{ {
ASSERT_PTHREAD_INTERNAL_SIZE (sem_t, struct new_sem);
/* Parameter sanity check. */ /* Parameter sanity check. */
if (__glibc_unlikely (value > SEM_VALUE_MAX)) if (__glibc_unlikely (value > SEM_VALUE_MAX))
{ {
@ -68,6 +70,8 @@ int
attribute_compat_text_section attribute_compat_text_section
__old_sem_init (sem_t *sem, int pshared, unsigned int value) __old_sem_init (sem_t *sem, int pshared, unsigned int value)
{ {
ASSERT_PTHREAD_INTERNAL_SIZE (sem_t, struct new_sem);
/* Parameter sanity check. */ /* Parameter sanity check. */
if (__glibc_unlikely (value > SEM_VALUE_MAX)) if (__glibc_unlikely (value > SEM_VALUE_MAX))
{ {

View File

@ -1,95 +0,0 @@
/* Copyright (C) 2005-2017 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <stdio.h>
#include <pthreadP.h>
#include <semaphore.h>
static const struct
{
const char *name;
size_t expected;
size_t is;
} types[] =
{
#define T(t, c) \
{ #t, c, sizeof (t) }
T (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T),
T (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T),
T (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T),
T (pthread_cond_t, __SIZEOF_PTHREAD_COND_T),
T (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T),
T (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T),
T (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T),
T (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T),
T (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T)
};
static int
do_test (void)
{
int result = 0;
#define TEST_TYPE(name) \
printf ("%s: ", #name); \
if (sizeof (name) != sizeof (((name *) 0)->__size)) \
{ \
printf ("expected %zu, is %zu\n", \
sizeof (((name *) 0)->__size), sizeof (name)); \
result = 1; \
} \
else \
puts ("OK")
TEST_TYPE (pthread_mutex_t);
TEST_TYPE (pthread_cond_t);
TEST_TYPE (pthread_rwlock_t);
#define TEST_TYPE2(name, internal) \
printf ("%s: ", #name); \
if (sizeof (((name *) 0)->__size) < sizeof (internal)) \
{ \
printf ("expected %zu, is %zu\n", \
sizeof (((name *) 0)->__size), sizeof (internal)); \
result = 1; \
} \
else \
puts ("OK")
TEST_TYPE2 (pthread_attr_t, struct pthread_attr);
TEST_TYPE2 (pthread_mutexattr_t, struct pthread_mutexattr);
TEST_TYPE2 (pthread_condattr_t, struct pthread_condattr);
TEST_TYPE2 (pthread_rwlockattr_t, struct pthread_rwlockattr);
TEST_TYPE2 (pthread_barrier_t, struct pthread_barrier);
TEST_TYPE2 (pthread_barrierattr_t, struct pthread_barrierattr);
TEST_TYPE2 (sem_t, struct new_sem);
TEST_TYPE2 (sem_t, struct old_sem);
for (size_t i = 0; i < sizeof (types) / sizeof (types[0]); ++i)
if (types[i].expected != types[i].is)
{
printf ("%s: expected %zu, is %zu\n",
types[i].name, types[i].expected, types[i].is);
result = 1;
}
return result;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"