Re: autoconf, clang static analyser and C++17

Arsen Arsenović <[email protected]>
Newsgroups gmane.comp.sysutils.autoconf.general
Message-ID <[email protected]>
Hi Peter,

Peter Hull <[email protected]> writes:

> Hi,
> I've got a problem running scan-build on some C++ 17 code and I'm not
> sure if the cause is me, scan-build or autoconf. I'd welcome any
> advice.
>
> I've made a small test case:(still long, sorry)
>
> $ cat configure.ac
> #                                               -*- Autoconf -*-
> # Process this file with autoconf to produce a configure script.
>
> AC_PREREQ([2.71])
> AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
> AC_CONFIG_SRCDIR([me.cc])
> AC_CONFIG_MACRO_DIR([m4])
>
> AC_PROG_CXX
> AX_CXX_COMPILE_STDCXX([17])
>
> AC_CONFIG_FILES([Makefile])
> AC_OUTPUT
>
> $ cat Makefile.in
> CXXFLAGS:=@CXXFLAGS@
> CXX:=@CXX@
>
> all: me
>
> clean:
>         -rm me
>
> $ cat me.cc
> #include <string>
> #include <string_view>
> #include <iostream>
>
> int main() {
>   std::string_view s("Hello");
>   std::cout << std::string(s) << std::endl;
>   return 0;
> }
>
>
> I've put the AX_CXX_COMPILE_STDCXX macro from
> https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
> into ./m4/
>
> I ran aclocal and autoconf then ./configure && make, and everything is fine.
>
> However scan-build ./configure && scan-build --keep-cc make gives me
> errors because it can't find std::string_view
>
> /usr/bin/../libexec/c++-analyzer -g -O2    me.cc   -o me
> me.cc:6:19: error: expected ';' after expression
>   std::string_view s("Hello");
>                   ^
>                   ;
> me.cc:6:8: error: no member named 'string_view' in namespace 'std'
>   std::string_view s("Hello");
>   ~~~~~^
>
> which I am assuming is because string_view was new in C++17 and the
> analyzer is defaulting to some version prior to that. In fact I can
> specify '-std=c++17' explicitly in the CXXFLAGS given to configure and
> it works.
>
> However, the purpose of the AX_CXX_COMPILE_STDCXX is to handle that
> for me I believe. During normal configuration I see this:
>
> $ ./configure
> checking for g++... g++
> ...lines omitted...
> checking for g++ option to enable C++11 features... none needed
> checking whether g++ supports C++17 features by default... yes
> configure: creating ./config.status
> config.status: creating Makefile
>
>
> $ scan-build ./configure
> scan-build: Using '/usr/bin/clang-15' for static analysis
> ...lines omitted...
> checking for /usr/bin/../libexec/c++-analyzer option to enable C++11
> features... none needed
> checking whether /usr/bin/../libexec/c++-analyzer supports C++17
> features by default... yes
> configure: creating ./config.status
> config.status: creating Makefile
>
> So I think maybe AX_CXX_COMPILE_STDCXX believes that a -std= flag
> isn't needed but it is.

AFAIU, scan-build inserts a fake compiler that compiles code using the
real compiler also.  This might be why you don't see failures while
configuring but do after configuring.  I believe that Clang 15 still
places the compilation standard at -std=gnu++14.  Most likely, it just
happens that the tests inside AX_CXX_COMPILE_STDCXX fail to catch this
discrepancy.  If I were you, I'd likely just pass CXXFLAGS=-std=c++17 to
the scan-build configure invocation and see if that works.

AX_CXX_COMPILE_STDCXX will not insert any flags if it believes that the
compiler already defaults to the desired or superior version of the
standard.  I am not sure why this behavior was chosen.

> Does this make sense? What do you think?
>
> Final bit:
> I'm running Fedora 37, autoconf (GNU Autoconf) 2.71,
> AX_CXX_COMPILE_STDCXX v15 (2021),  g++ (GCC) 12.2.1, and clang version
> 15.0.7
>
> Thanks,
> Peter

Hope that helps, have a lovely day.
-- 
Arsen Arsenović
signature.asc (application/pgp-signature, 381 B)
-----BEGIN PGP SIGNATURE-----

iOYEARYKAI4WIQT+4rPRE/wAoxYtYGFSwpQwHqLEkwUCY++roV8UgAAAAAAuAChp
c3N1ZXItZnByQG5vdGF0aW9ucy5vcGVucGdwLmZpZnRoaG9yc2VtYW4ubmV0RkVF
MkIzRDExM0ZDMDBBMzE2MkQ2MDYxNTJDMjk0MzAxRUEyQzQ5MxAcYXJzZW5AYWFy
c2VuLm1lAAoJEFLClDAeosSTZ3YA/3uIteHlw3JoxfC7de1uNcNYnPEOq7wU/OuQ
lNq1H+qTAQDVIiBqOYCv4DZWY8kv3KEoOCZMd93tOoa05Vswbt0WCQ==
=aCvQ
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.