Bug 215125

Summary: clang: Turning on sanitizer options causes the test for non-existent function mallinfo() to pass
Product: Base System Reporter: Yuri Victorovich <yuri>
Component: binAssignee: Dimitry Andric <dim>
Status: Closed FIXED    
Severity: Affects Only Me CC: dim, emaste
Priority: ---    
Version: 11.0-STABLE   
Hardware: Any   
OS: Any   
Bug Depends on:    
Bug Blocks: 215123    
Attachments:
Description Flags
C test program: conftest.c none

Description Yuri Victorovich freebsd_committer freebsd_triage 2016-12-07 19:21:29 UTC
Created attachment 177764 [details]
C test program: conftest.c

It fails without the sanitizer options:
> cc -o conftest -O2 -pipe -fno-omit-frame-pointer  -fstack-protector -fno-strict-aliasing -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Qunused-arguments -fstack-protector-all -Wstack-protector -fwrapv --param ssp-buffer-size=1 -fPIE -fasynchronous-unwind-tables -fno-omit-frame-pointer -I${top_srcdir}/src/common  -Wl,-rpath,/usr/local/lib -fstack-protector -pie -Wl,-z,relro -Wl,-z,now -rdynamic conftest.c -lpthread -lexecinfo

It succeeds with the sanitizer options:
> cc -o conftest -O2 -pipe -fno-omit-frame-pointer  -fstack-protector -fno-strict-aliasing -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Qunused-arguments -fstack-protector-all -Wstack-protector -fwrapv --param ssp-buffer-size=1 -fPIE -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -fasynchronous-unwind-tables -fno-omit-frame-pointer -I${top_srcdir}/src/common  -Wl,-rpath,/usr/local/lib -fstack-protector -pie -Wl,-z,relro -Wl,-z,now -rdynamic conftest.c -lpthread -lexecinfo

I found this during security/tor build on FreeBSD 11 amd64.

Sanitizer options shouldn't make such difference, and the test should always fail because there is no such function.
Comment 1 Dimitry Andric freebsd_committer freebsd_triage 2016-12-10 14:49:52 UTC
Interesting, this is because the sanitizers have several interceptors for Linux-specific functions and variables, and these cause the link to succeed.

I will check with upstream how we can best solve this. Most likely these interceptors should be disabled completely for FreeBSD.
Comment 2 commit-hook freebsd_committer freebsd_triage 2017-02-01 20:41:59 UTC
A commit references this bug:

Author: dim
Date: Wed Feb  1 20:41:09 UTC 2017
New revision: 313052
URL: https://svnweb.freebsd.org/changeset/base/313052

Log:
  Pull in r293536 from upstream compiler-rt trunk:

    Recommit: Stop intercepting some malloc-related functions on FreeBSD
    and macOS

    Summary:
    In https://bugs.freebsd.org/215125 I was notified that some configure
    scripts attempt to test for the Linux-specific `mallinfo` and
    `mallopt` functions by compiling and linking small programs which
    references the functions, and observing whether that results in
    errors.

    FreeBSD and macOS do not have the `mallinfo` and `mallopt` functions,
    so normally these tests would fail, but when sanitizers are enabled,
    they incorrectly succeed, because the sanitizers define interceptors
    for these functions.  This also applies to some other malloc-related
    functions, such as `memalign`, `pvalloc` and `cfree`.

    Fix this by not intercepting `mallinfo`, `mallopt`, `memalign`,
    `pvalloc` and `cfree` for FreeBSD and macOS, in all sanitizers.

    Also delete the non-functional `cfree` wrapper for Windows, to fix the
    test cases on that platform.

    Reviewers: emaste, kcc, rnk

    Subscribers: timurrrr, eugenis, hans, joerg, llvm-commits, kubamracek

    Differential Revision: https://reviews.llvm.org/D27654

  This prevents autoconf scripts from incorrectly detecting that functions
  like mallinfo, mallopt, memalign, pvalloc and cfree are supported.

  PR:		215125, 215455
  MFC after:	1 week

Changes:
  head/contrib/compiler-rt/lib/asan/asan_malloc_linux.cc
  head/contrib/compiler-rt/lib/asan/asan_malloc_win.cc
  head/contrib/compiler-rt/lib/lsan/lsan_interceptors.cc
  head/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
Comment 3 commit-hook freebsd_committer freebsd_triage 2017-02-13 18:39:53 UTC
A commit references this bug:

Author: dim
Date: Mon Feb 13 18:39:22 UTC 2017
New revision: 313702
URL: https://svnweb.freebsd.org/changeset/base/313702

Log:
  MFC r313052:

  Pull in r293536 from upstream compiler-rt trunk:

    Recommit: Stop intercepting some malloc-related functions on FreeBSD
    and macOS

    Summary:
    In https://bugs.freebsd.org/215125 I was notified that some configure
    scripts attempt to test for the Linux-specific `mallinfo` and
    `mallopt` functions by compiling and linking small programs which
    references the functions, and observing whether that results in
    errors.

    FreeBSD and macOS do not have the `mallinfo` and `mallopt` functions,
    so normally these tests would fail, but when sanitizers are enabled,
    they incorrectly succeed, because the sanitizers define interceptors
    for these functions.  This also applies to some other malloc-related
    functions, such as `memalign`, `pvalloc` and `cfree`.

    Fix this by not intercepting `mallinfo`, `mallopt`, `memalign`,
    `pvalloc` and `cfree` for FreeBSD and macOS, in all sanitizers.

    Also delete the non-functional `cfree` wrapper for Windows, to fix the
    test cases on that platform.

    Reviewers: emaste, kcc, rnk

    Subscribers: timurrrr, eugenis, hans, joerg, llvm-commits, kubamracek

    Differential Revision: https://reviews.llvm.org/D27654

  This prevents autoconf scripts from incorrectly detecting that functions
  like mallinfo, mallopt, memalign, pvalloc and cfree are supported.

  PR:		215125, 215455

Changes:
_U  stable/11/
  stable/11/contrib/compiler-rt/lib/asan/asan_malloc_linux.cc
  stable/11/contrib/compiler-rt/lib/asan/asan_malloc_win.cc
  stable/11/contrib/compiler-rt/lib/lsan/lsan_interceptors.cc
  stable/11/contrib/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h