esbmc / esbmc

The efficient SMT-based context-bounded model checker (ESBMC)
http://esbmc.org/
Other
288 stars 92 forks source link

[C++] Parsing fails with combinations of `--no-abstracted-cpp-includes` and/or `--no-library` for `<iostream>` #1667

Closed intrigus-lgtm closed 2 months ago

intrigus-lgtm commented 8 months ago

Information

ESMB version: ESBMC version 7.5.0 64-bit x86_64 linux Kernel/OS: Linux debian 6.1.0-17-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.69-1 (2023-12-30) x86_64 GNU/Linux GCC version: gcc (Debian 12.2.0-14) 12.2.0 Clang version: Debian clang version 14.0.6 Target: x86_64-pc-linux-gnu

Code

#include <iostream>
#include <string_view>

int main()
{
    std::string_view message = "Hello, World!";
}

If we run esbmc --cppstd 17 --input-file cpptest.cpp --no-abstracted-cpp-includes --no-library we get the following errors:

```shell $ esbmc --cppstd 17 --input-file cpptest.cpp --no-abstracted-cpp-includes --no-library ESBMC version 7.5.0 64-bit x86_64 linux Target: 64-bit little-endian x86_64-unknown-linux with systemlibc Parsing cpptest.cpp In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:33: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:50: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char *') return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char16_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char32_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:42: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/ios_base.h:41: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_classes.h:40: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string:53: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_string.h:3960: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ext/string_conversions.h:43: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:115:11: error: no member named 'fscanf' in the global namespace using ::fscanf; ~~^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:134:11: error: no member named 'scanf' in the global namespace using ::scanf; ~~^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:138:11: error: no member named 'sscanf' in the global namespace using ::sscanf; ~~^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:912:8: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:912:25: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::ctype::char_type *' (aka 'char *') __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:978:8: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:978:25: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'char *' __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1118:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1118:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::ctype::char_type *' (aka 'char *') __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1172:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1172:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'char *' __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ ERROR: PARSING ERROR ```

If we run esbmc --cppstd 17 --input-file cpptest.cpp --no-abstracted-cpp-includes we get the following errors:

```shell $ esbmc --cppstd 17 --input-file cpptest.cpp --no-abstracted-cpp-includes ESBMC version 7.5.0 64-bit x86_64 linux Target: 64-bit little-endian x86_64-unknown-linux with esbmclibc Parsing cpptest.cpp In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:33: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:50: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char *') return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char16_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char32_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:41: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/localefwd.h:42: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cctype:87:11: error: no member named 'isblank' in the global namespace using ::isblank; ~~^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:42: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/ios_base.h:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ext/atomicity.h:35: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/gthr.h:148: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/gthr-default.h:693:19: error: use of undeclared identifier 'sched_yield' return __gthrw_(sched_yield) (); ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:42: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/ios_base.h:41: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_classes.h:40: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string:53: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_string.h:3960: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ext/string_conversions.h:43: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:115:11: error: no member named 'fscanf' in the global namespace using ::fscanf; ~~^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:134:11: error: no member named 'scanf' in the global namespace using ::scanf; ~~^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:138:11: error: no member named 'sscanf' in the global namespace using ::sscanf; ~~^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:49:35: error: use of undeclared identifier '_ISupper'; did you mean '_ISwupper'? static const mask upper = _ISupper; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:71:3: note: '_ISwupper' declared here _ISwupper = _ISwbit (__ISwupper), /* UPPERCASE. */ ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:50:32: error: use of undeclared identifier '_ISlower'; did you mean '_ISwlower'? static const mask lower = _ISlower; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:72:3: note: '_ISwlower' declared here _ISwlower = _ISwbit (__ISwlower), /* lowercase. */ ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:51:32: error: use of undeclared identifier '_ISalpha'; did you mean '_ISwalpha'? static const mask alpha = _ISalpha; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:73:3: note: '_ISwalpha' declared here _ISwalpha = _ISwbit (__ISwalpha), /* Alphabetic. */ ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:52:32: error: use of undeclared identifier '_ISdigit'; did you mean '_ISwdigit'? static const mask digit = _ISdigit; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:74:3: note: '_ISwdigit' declared here _ISwdigit = _ISwbit (__ISwdigit), /* Numeric. */ ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:53:33: error: use of undeclared identifier '_ISxdigit' static const mask xdigit = _ISxdigit; ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:54:32: error: use of undeclared identifier '_ISspace'; did you mean '_ISwspace'? static const mask space = _ISspace; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:76:3: note: '_ISwspace' declared here _ISwspace = _ISwbit (__ISwspace), /* Whitespace. */ ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:55:32: error: use of undeclared identifier '_ISprint'; did you mean '_ISwprint'? static const mask print = _ISprint; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:77:3: note: '_ISwprint' declared here _ISwprint = _ISwbit (__ISwprint), /* Printing. */ ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12/bits/ctype_base.h:56:32: error: use of undeclared identifier '_ISalpha'; did you mean '_ISwalpha'? static const mask graph = _ISalpha | _ISdigit | _ISpunct; ^ /usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:73:3: note: '_ISwalpha' declared here _ISwalpha = _ISwbit (__ISwalpha), /* Alphabetic. */ ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] ERROR: PARSING ERROR ```

If we run esbmc --cppstd 17 --input-file cpptest.cpp --no-library we get the following errors:

```shell $ esbmc --cppstd 17 --input-file cpptest.cpp --no-library ESBMC version 7.5.0 64-bit x86_64 linux Target: 64-bit little-endian x86_64-unknown-linux with systemlibc Parsing cpptest.cpp In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:33: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:50: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char *') return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char16_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char32_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:42: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/ios_base.h:41: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_classes.h:40: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string:53: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_string.h:3960: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ext/string_conversions.h:43: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:115:11: error: no member named 'fscanf' in the global namespace using ::fscanf; ~~^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:134:11: error: no member named 'scanf' in the global namespace using ::scanf; ~~^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cstdio:138:11: error: no member named 'sscanf' in the global namespace using ::sscanf; ~~^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:912:8: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:912:25: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::ctype::char_type *' (aka 'char *') __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:978:8: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:978:25: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'char *' __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1118:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1118:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::ctype::char_type *' (aka 'char *') __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1172:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? __builtin_memcpy(__to, __lo, __hi - __lo); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:1: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iostream:39: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ostream:38: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/ios:44: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/basic_ios.h:37: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/locale_facets.h:1172:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'char *' __builtin_memcpy(__to, __lo, __hi - __lo); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ ERROR: PARSING ERROR ```

If we run esbmc --cppstd 17 --input-file cpptest.cpp we get the following errors:

```shell $ esbmc --cppstd 17 --input-file cpptest.cpp ESBMC version 7.5.0 64-bit x86_64 linux Target: 64-bit little-endian x86_64-unknown-linux with esbmclibc Parsing cpptest.cpp In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:40: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iosfwd:40: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/postypes.h:40: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:44: In file included from /usr/include/wchar.h:46: /usr/include/x86_64-linux-gnu/bits/types/FILE.h:7:25: error: typedef redefinition with different types ('struct _IO_FILE' vs 'void *') typedef struct _IO_FILE FILE; ^ /tmp/esbmc-cpp-headers-8097-d1df-3d17/cstdio:26:15: note: previous definition is here typedef void* FILE; ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iosfwd:132:29: error: typedef redefinition with different types ('basic_ios' vs 'std::ios') typedef basic_ios ios; ^ /tmp/esbmc-cpp-headers-8097-d1df-3d17/ios:141:7: note: previous definition is here class ios: public ios_base{ ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iosfwd:135:34: error: typedef redefinition with different types ('basic_streambuf' vs 'std::streambuf') typedef basic_streambuf streambuf; ^ /tmp/esbmc-cpp-headers-8097-d1df-3d17/streambuf:24:7: note: previous definition is here class streambuf{ ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iosfwd:138:33: error: typedef redefinition with different types ('basic_istream' vs 'std::istream') typedef basic_istream istream; ^ /tmp/esbmc-cpp-headers-8097-d1df-3d17/istream:10:9: note: previous definition is here class istream: virtual public ios ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iosfwd:141:33: error: typedef redefinition with different types ('basic_ostream' vs 'std::ostream') typedef basic_ostream ostream; ^ /tmp/esbmc-cpp-headers-8097-d1df-3d17/ostream:11:9: note: previous definition is here class ostream: virtual public ios ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:40: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/iosfwd:144:34: error: typedef redefinition with different types ('basic_iostream' vs 'std::iostream') typedef basic_iostream iostream; ^ /tmp/esbmc-cpp-headers-8097-d1df-3d17/iostream:11:8: note: previous definition is here class iostream: public ostream, public istream ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:33: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:431:50: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char *') return static_cast(__builtin_memcpy(__s1, __s2, __n)); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:826:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char16_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:4: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'? (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^ :6:26: note: expanded from here #define __builtin_memcpy memcpy ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/cwchar:201:11: note: 'wmemcpy' declared here using ::wmemcpy; ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:41: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/char_traits.h:947:21: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'std::char_traits::char_type *' (aka 'char32_t *') (__builtin_memcpy(__s1, __s2, __n * sizeof(char_type)))); ^~~~ /usr/include/wchar.h:263:46: note: passing argument to parameter '__s1' here extern wchar_t *wmemcpy (wchar_t *__restrict __s1, ^ In file included from cpptest.cpp:2: In file included from /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/string_view:43: /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:72:31: error: use of undeclared identifier '__void_t' struct __poison_hash<_Tp, __void_t()(declval<_Tp>()))>> ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:78:33: error: no template named 'is_enum' template::value> ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:94:32: error: no template named 'underlying_type' using __type = typename underlying_type<_Tp>::type; ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:95:20: error: use of undeclared identifier '__type' return hash<__type>{}(static_cast<__type>(__val)); ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:95:42: error: unknown type name '__type' return hash<__type>{}(static_cast<__type>(__val)); ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:102:19: error: too few template arguments for class template '__hash_enum' struct hash : __hash_enum<_Tp> ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:79:12: note: template is declared here struct __hash_enum ^ /../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/bits/functional_hash.h:288:41: error: expected class name struct __is_fast_hash : public std::true_type ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] ERROR: PARSING ERROR ```

Expected Result

ESBMC successfully compiles the file.

XLiZHI commented 8 months ago

1666

fbrausse commented 8 months ago

@intrigus-lgtm At the moment, running ESBMC with either --no-library or --no-abstracted-cpp-includes on programs that use the C or C++ standard library is not supported in a platform-independent manner, which we aim at: ESBMC runs on Linux, Windows and MacOS. May I ask for what reason you expect ESBMC to work correctly on C++ programs using those libraries while passing --no-library and/or --no-abstracted-cpp-includes?

~Note also that <string_view> is only available since C++17. You can pass --cppstd 17 or higher for that to ESBMC to enable those later additions from the system's default library implementation.~ Edit: sorry, I missed you're using this option already.

intrigus-lgtm commented 8 months ago

May I ask for what reason you expect ESBMC to work correctly on C++ programs using those libraries while passing --no-library and/or --no-abstracted-cpp-includes?

No particular reason, but I thought I don't need any of the existing models and didn't want to spend time to model them (and esbmc --help listed the options^^). My end goal is to verify some custom asserts, I don't really care about any existing memory checks right now.

At the moment, running ESBMC with either --no-library or --no-abstracted-cpp-includes on programs that use the C or C++ standard library is not supported in a platform-independent manner

May I ask what the issue is on other platforms or is there an existing issue?

fbrausse commented 8 months ago

No particular reason, but I thought I don't need any of the existing models and didn't want to spend time to model them (and esbmc --help listed the options^^). My end goal is to verify some custom asserts, I don't really care about any existing memory checks right now.

Good point, thanks. Those options are primarily for debugging system compatibilty. We should move them to the "Debug" section.

If you're not interested in pointer or other checks for now, these can selectively be disabled (listed in help message under "Property checking"). Memory leak checks are opt-in.

  --no-bounds-check                     do not do array bounds check
  --no-pointer-check                    do not do pointer check
  --no-align-check                      do not check pointer alignment
  --memory-leak-check                   enable memory leak check
[...]

Maybe to clarify: The models distributed with ESBMC are generally provided to cover a larger range of language and library features and to speed up verification. System library headers are too different in their implementations and also assume a specific library implementation which ESBMC doesn't have access to when running. So it should be fine to keep the models enabled.

As for C++, it's a work in progress since the library is so large. In particular supporting the system's \<iostream> is tricky because it combines lots of C++ features into a single implementation (exceptions, virtual methods, templates). For simpler C++ programs with user-defined types there should be fewer issues, but feel free to open bugs here for ones with the library as well.

At the moment, running ESBMC with either --no-library or --no-abstracted-cpp-includes on programs that use the C or C++ standard library is not supported in a platform-independent manner

May I ask what the issue is on other platforms or is there an existing issue?

Sure, there are parts of the libraries that we need to model ourselves and where it's near impossible to work with the arbitrary types the varying system libraries provide, pthreads is one such example. Another one: We'd also like to have some control over the floating point environment, so \<fenv.h> shouldn't be taken from the system because the constants for the rounding modes FE_UPWARD etc. could vary.

fbrausse commented 2 months ago

Either option is incompatible with programs that actually include library headers. I'll close this for now. Please reopen if a concrete problem can be described.