CHECK_CXX_COMPILER_FLAG doesn't give correct result for -fsanitize=address

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

CHECK_CXX_COMPILER_FLAG doesn't give correct result for -fsanitize=address

CMake mailing list

Hi CMake Mailing List,


I am using the CHECK_CXX_COMPILER_FLAG directive in a CMake file to detect whether the compiler uses the "-fsanitize=address" compiler flag. I'm using the g++ 7.3.0 compiler which supports this flag but the CHECK_CXX_COMPILER_FLAG directive incorrectly determines that this flag is not supported.


To test this I tried compiling the following program:

int main() {};


This compiled with the following commands:

> g++ -fsanitize=address -c test.cpp
> g++ -fsanitize=address test.o -o test.exe

And fails with the same error message as CHECK_CXX_COMPILER_FLAG when I compile with:
> g++ -fsanitize=address -c test.cpp
> g++ test.o -o test.exe

producing the following message:

Undefined symbols for architecture x86_64:
  "___asan_init", referenced from:
      __GLOBAL__sub_I_00099_0_test.cpp in test.o
  "___asan_version_mismatch_check_v8", referenced from:
      __GLOBAL__sub_I_00099_0_test.cpp in test.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

It seems that CHECK_CXX_COMPILER_FLAG doesn't add the flag to the linking command when it tests compilation. Is this a bug with CHECK_CXX_COMPILER_FLAG or is there something I'm missing?

Many thanks
Adrian Turner



--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: CHECK_CXX_COMPILER_FLAG doesn't give correct result for -fsanitize=address

Michael Ellery
I’ve dealt with that using something like this:

  set (_saved_CRL ${CMAKE_REQUIRED_LIBRARIES})
  set (CMAKE_REQUIRED_LIBRARIES “-fsanitize=address;asan")
  check_cxx_compiler_flag (-fsanitize=address COMPILER_SUPPORTS_SAN)
  set (CMAKE_REQUIRED_LIBRARIES ${_saved_CRL})

the second item in CMAKE_REQUIRED_LIBRARIES is only needed when using gcc which also requires a -lasan when linking (clang does not need this)

> On Oct 24, 2019, at 12:47 PM, Turner, Adrian Keith via CMake <[hidden email]> wrote:
>
> Hi CMake Mailing List,
>
> I am using the CHECK_CXX_COMPILER_FLAG directive in a CMake file to detect whether the compiler uses the "-fsanitize=address" compiler flag. I'm using the g++ 7.3.0 compiler which supports this flag but the CHECK_CXX_COMPILER_FLAG directive incorrectly determines that this flag is not supported.
>
> To test this I tried compiling the following program:
> int main() {};
>
> This compiled with the following commands:
> > g++ -fsanitize=address -c test.cpp
> > g++ -fsanitize=address test.o -o test.exe
>
> And fails with the same error message as CHECK_CXX_COMPILER_FLAG when I compile with:
> > g++ -fsanitize=address -c test.cpp
> > g++ test.o -o test.exe
>
> producing the following message:
> Undefined symbols for architecture x86_64:
>   "___asan_init", referenced from:
>       __GLOBAL__sub_I_00099_0_test.cpp in test.o
>   "___asan_version_mismatch_check_v8", referenced from:
>       __GLOBAL__sub_I_00099_0_test.cpp in test.o
> ld: symbol(s) not found for architecture x86_64
> collect2: error: ld returned 1 exit status
>
> It seems that CHECK_CXX_COMPILER_FLAG doesn't add the flag to the linking command when it tests compilation. Is this a bug with CHECK_CXX_COMPILER_FLAG or is there something I'm missing?
>
> Many thanks
> Adrian Turner
>
>
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: CHECK_CXX_COMPILER_FLAG doesn't give correct result for -fsanitize=address

Marc CHEVRIER
This is the expected behaviour.

As you already discovered, it is possible to control the compilation and link steps with variables as described in https://cmake.org/cmake/help/latest/module/CheckCXXSourceCompiles.html#module:CheckCXXSourceCompiles.

To specify, in a more clean way, link options, use preferably the variable CMAKE_REQUIRED_LINK_OPTIONS.

Le 24 oct. 2019 à 22:42 +0200, Michael Ellery <[hidden email]>, a écrit :
I’ve dealt with that using something like this:

set (_saved_CRL ${CMAKE_REQUIRED_LIBRARIES})
set (CMAKE_REQUIRED_LIBRARIES “-fsanitize=address;asan")
check_cxx_compiler_flag (-fsanitize=address COMPILER_SUPPORTS_SAN)
set (CMAKE_REQUIRED_LIBRARIES ${_saved_CRL})

the second item in CMAKE_REQUIRED_LIBRARIES is only needed when using gcc which also requires a -lasan when linking (clang does not need this)

On Oct 24, 2019, at 12:47 PM, Turner, Adrian Keith via CMake <[hidden email]> wrote:

Hi CMake Mailing List,

I am using the CHECK_CXX_COMPILER_FLAG directive in a CMake file to detect whether the compiler uses the "-fsanitize=address" compiler flag. I'm using the g++ 7.3.0 compiler which supports this flag but the CHECK_CXX_COMPILER_FLAG directive incorrectly determines that this flag is not supported.

To test this I tried compiling the following program:
int main() {};

This compiled with the following commands:
g++ -fsanitize=address -c test.cpp
g++ -fsanitize=address test.o -o test.exe

And fails with the same error message as CHECK_CXX_COMPILER_FLAG when I compile with:
g++ -fsanitize=address -c test.cpp
g++ test.o -o test.exe

producing the following message:
Undefined symbols for architecture x86_64:
"___asan_init", referenced from:
__GLOBAL__sub_I_00099_0_test.cpp in test.o
"___asan_version_mismatch_check_v8", referenced from:
__GLOBAL__sub_I_00099_0_test.cpp in test.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

It seems that CHECK_CXX_COMPILER_FLAG doesn't add the flag to the linking command when it tests compilation. Is this a bug with CHECK_CXX_COMPILER_FLAG or is there something I'm missing?

Many thanks
Adrian Turner


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: CHECK_CXX_COMPILER_FLAG doesn't give correct result for -fsanitize=address

Eric Noulard
In reply to this post by CMake mailing list


Le jeu. 24 oct. 2019 à 22:32, Turner, Adrian Keith via CMake <[hidden email]> a écrit :

Hi CMake Mailing List,


I am using the CHECK_CXX_COMPILER_FLAG directive in a CMake file to detect whether the compiler uses the "-fsanitize=address" compiler flag. I'm using the g++ 7.3.0 compiler which supports this flag but the CHECK_CXX_COMPILER_FLAG directive incorrectly determines that this flag is not supported.


You get appropriate answers to your initial question.

I'll add an alternative to your hand-crafted way to get sanitizers working.

and I find it easy to use and convenient when compiling with either clang or gcc.


--
Eric

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake