Makefile: Blacklist functions that threaded programs cannot use safely.
authorBen Pfaff <blp@nicira.com>
Fri, 5 Apr 2013 13:58:57 +0000 (08:58 -0500)
committerBen Pfaff <blp@nicira.com>
Fri, 28 Jun 2013 23:09:39 +0000 (16:09 -0700)
Some functions that POSIX says cannot be used safely in multithreaded
programs are not on the initial blacklist:

    - getenv() should be safe in real implementations in the absence of
      changes to the environment.  (putenv() and setenv() are blacklisted.)

    - We only use getopt() before spawning extra threads, and I expect this
      to continue to be true.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Makefile.am
build-aux/thread-safety-blacklist [new file with mode: 0644]

index 488aed2..08aea0f 100644 (file)
@@ -210,6 +210,20 @@ check-assert-h-usage:
         fi
 .PHONY: check-assert-h-usage
 
+ALL_LOCAL += thread-safety-check
+thread-safety-check:
+       @if test -e '$(srcdir)'/.git && (git --version) >/dev/null 2>&1 && \
+          grep -n -f '$(srcdir)'/build-aux/thread-safety-blacklist \
+              `git ls-files '$(srcdir)' | grep '\.[ch]$$' \
+                | $(EGREP) -v '^datapath|^lib/sflow|^third-party'` \
+              | $(EGREP) -v ':[        ]*/?\*'; \
+       then \
+           echo "See above for list of calls to functions that are"; \
+           echo "blacklisted due to thread safety issues"; \
+           exit 1; \
+       fi
+EXTRA_DIST += build-aux/thread-safety-blacklist
+
 if HAVE_GROFF
 ALL_LOCAL += manpage-check
 manpage-check: $(man_MANS) $(dist_man_MANS) $(noinst_man_MANS)
diff --git a/build-aux/thread-safety-blacklist b/build-aux/thread-safety-blacklist
new file mode 100644 (file)
index 0000000..42560df
--- /dev/null
@@ -0,0 +1,90 @@
+\basctime(
+\bbasename(
+\bcatgets(
+\bcrypt(
+\bctermid(
+\bctime(
+\bdbm_clearerr(
+\bdbm_close(
+\bdbm_delete(
+\bdbm_error(
+\bdbm_fetch(
+\bdbm_firstkey(
+\bdbm_nextkey(
+\bdbm_open(
+\bdbm_store(
+\bdirname(
+\bdlerror(
+\bdrand48(
+\becvt(
+\bencrypt(
+\bendgrent(
+\bendpwent(
+\bendutxent(
+\bfcvt(
+\bftw(
+\bgcvt(
+\bgetc_unlocked(
+\bgetchar_unlocked(
+\bgetdate(
+\bgetgrent(
+\bgetgrgid(
+\bgetgrnam(
+\bgethostbyaddr(
+\bgethostbyname(
+\bgethostent(
+\bgetlogin(
+\bgetmntent(
+\bgetnetbyaddr(
+\bgetnetbyname(
+\bgetnetent(
+\bgetprotobyname(
+\bgetprotobynumber(
+\bgetprotoent(
+\bgetpwent(
+\bgetpwnam(
+\bgetpwuid(
+\bgetservbyname(
+\bgetservbyport(
+\bgetservent(
+\bgetutxent(
+\bgetutxid(
+\bgetutxline(
+\bgmtime(
+\bhcreate(
+\bhdestroy(
+\bhsearch(
+\binet_ntoa(
+\bl64a(
+\blgamma(
+\blgammaf(
+\blgammal(
+\blocaleconv(
+\blocaltime(
+\blrand48(
+\bmrand48(
+\bnftw(
+\bnl_langinfo(
+\bptsname(
+\bputc_unlocked(
+\bputchar_unlocked(
+\bputenv(
+\bpututxline(
+\brand(
+\bsetenv(
+\bsetgrent(
+\bsetkey(
+\bsetpwent(
+\bsetutxent(
+\bsigprocmask(
+\bstrerror(
+\bstrsignal(
+\bstrtok(
+\bsystem(
+\btmpnam(
+\bttyname(
+\bunsetenv(
+\bwcrtomb(
+\bwcsrtombs(
+\bwcstombs(
+\bwctomb(