Please check the GNU Autoconf Macro Archive for Updates
AC-Archive
Autoconf Macro Archive

ac-archive.sf.net: - Project CVS - Download
Macro Index
- AM Support
- C++ Support
- C Support
- Fortran Support
- Java Support
- Cross Compilation
- Installed Packages
- Miscellaneous
- LaTeX Support
- Uncategorized
- archive macros
- adl's macros
- bkorb's macros
- guidod's macros
- latex's macros
- other's macros
- rleigh's macros
- obsoleted macros
- released macros
- search index

Documentation
- Contribute!
- History
- acincludedir m4
- acinclude (tool)
- macro howto
- ax tricks
- maintainers
- License
- Topics

generated...
2007-08-05

(C) 2007 guidod
Download the M4 Source.

ax_dll_string

Back to the Main Page.

Synopsis
AX_DLL_STRING ,

Tests for a bug currently in g++ 3.4.4 on Cygwin where passing an empty std::string to a dll will cause a crash on destruction.

Version

2006-04-08

Author

Steven Brown <swbrown@variadic.org>

License

AllPermissive
Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Users of this software should generally follow the principles of the MIT License includings its disclaimer.

Category

cryp.to ac-archive's C++ Support (released)

Documentation

Tests for a bug currently in g++ 3.4.4 on Cygwin (maybe other targets with statically linked libstdc++?) where passing an empty std::string to a dll will cause a crash on destruction due to incorrect memory handling. See bug 24196 in gcc's bugzilla for more details: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24196

M4 Source Code
dnl Plan: compile conftest-dll.cc, conftest-exe.cc.  It has a 'crash' param
dnl that can be passed.  Verify the compile worked and we can run it normally
dnl ok.  Then, pass 'crash', test if it crashed, fail.

AC_DEFUN([AX_DLL_STRING],
[
  AC_MSG_CHECKING(if the dll string test can be compiled)
  cat &lt;&lt; EOF &gt; conftest-dll.cc
[
#include &lt;string&gt;
using namespace std;

void testit(std::string (*contentGet)()) {
  contentGet();
}
]
EOF
  cat &lt;&lt; EOF &gt; conftest-exe.cc
[
#include &lt;string&gt;
#include &lt;cstring&gt;
using namespace std;

extern void testit(std::string (*contentGet)());

std::string contentGet() {
  return string(""); // Anything other than empty string works.
}

int main(int argc, char *argv[]) {
  if(argc == 2 &amp;&amp; strcmp(argv[1], "crash") == 0) {
    testit(&amp;contentGet);
  }
  return 0;
}
]
EOF
  $CXX -shared $CFLAGS $CPPFLAGS conftest-dll.cc -o conftest-dll.dll &gt;&amp;AS_MESSAGE_LOG_FD &amp;&amp; $CXX $CFLAGS $CPPFLAGS conftest-exe.cc conftest-dll.dll -o conftest-exe.exe &gt;&amp; AS_MESSAGE_LOG_FD
  if test x"$?" = x"0"; then
    AC_MSG_RESULT(yes)

    dnl Make sure it runs normally first.
    AC_MSG_CHECKING(if the dll string test is usable)
    if /bin/sh -c "(LD_LIBRARY_PATH=\"$PWD\" ./conftest-exe.exe)" &gt;&amp; AS_MESSAGE_LOG_FD 2&gt;&amp;1; then
      AC_MSG_RESULT(yes)

      dnl Now we can check for the bug.
      AC_MSG_CHECKING(if the dll string test is affected by gcc bug 24196)
      if ! /bin/sh -c "(LD_LIBRARY_PATH=\"$PWD\" ./conftest-exe.exe crash)" &gt;&amp; AS_MESSAGE_LOG_FD 2&gt;&amp;1; then
        AC_MSG_RESULT(yes)

        dnl We have the bug, user'll need to fix it.
        AC_MSG_ERROR([*** This toolchain is affected by gcc bug 24196.  For Cygwin as of 4/8/2006, you can downgrade to gcc/g++ 3.3.3 or check if there is a newer compiler available that's fixed.])
      else
        AC_MSG_RESULT(no)
      fi
    else
      AC_MSG_RESULT(no)
    fi
  else
    AC_MSG_RESULT(no)
  fi
])