[PATCH] D18854: [sanitizer] Fix sem_init_glibc.cc test on __HAVE_64B_ATOMIC arches.
Marcin KoĆcielnicki via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 7 03:11:00 PDT 2016
koriakin created this revision.
koriakin added reviewers: samsonov, eugenis.
koriakin added a subscriber: llvm-commits.
koriakin set the repository for this revision to rL LLVM.
koriakin added a project: Sanitizers.
glibc can use one of 2 layouts for semaphores: architectures that
don't __HAVE_64B_ATOMIC use an uint32_t field with semaphore value,
then a private field, then a waiting thread count field - this is
the layout currently assumed by the test. However, __HAVE_64B_ATOMIC
arches use a fused uint64_t field that contains the value in low bits
and waiting thread count in high bits, followed by a private field.
This resulted in taking private field from the wrong offset on 64-bit
atomic platforms (the test still passed, but didn't actually test
the private field). On big-endian platforms, this resulted in a fail,
since the first 4 bytes overlay the thread count field, and not
the value field.
Found while porting ASan to s390x.
Repository:
rL LLVM
http://reviews.llvm.org/D18854
Files:
test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc
Index: test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc
===================================================================
--- test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc
+++ test/sanitizer_common/TestCases/Linux/sem_init_glibc.cc
@@ -5,21 +5,31 @@
#include <assert.h>
#include <semaphore.h>
#include <string.h>
+#include <stdint.h>
-void my_sem_init(bool priv, int value, unsigned *a, unsigned char *b) {
+// This condition needs to correspond to __HAVE_64B_ATOMICS macro in glibc.
+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) || \
+ defined(__s390x__) || defined(__sparc64__) || defined(__alpha__) || \
+ defined(__ia64__) || defined(__m68k__)
+typedef uint64_t semval_t;
+#else
+typedef unsigned semval_t;
+#endif
+
+void my_sem_init(bool priv, int value, semval_t *a, unsigned char *b) {
sem_t sem;
memset(&sem, 0xAB, sizeof(sem));
sem_init(&sem, priv, value);
char *p = (char *)&sem;
- memcpy(a, p, sizeof(unsigned));
- memcpy(b, p + sizeof(unsigned), sizeof(char));
+ memcpy(a, p, sizeof(semval_t));
+ memcpy(b, p + sizeof(semval_t), sizeof(char));
sem_destroy(&sem);
}
int main() {
- unsigned a;
+ semval_t a;
unsigned char b;
my_sem_init(false, 42, &a, &b);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18854.52891.patch
Type: text/x-patch
Size: 1264 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160407/f2bc580a/attachment.bin>
More information about the llvm-commits
mailing list