void ansi_c_internal_additions(std::string &code) { code+= "# 1 \"<built-in-additions>\"\n" "typedef __typeof__(sizeof(int)) __CPROVER_size_t;\n" "void __CPROVER_assume(__CPROVER_bool assumption);\n" "void __VERIFIER_assume(__CPROVER_bool assumption);\n" "void __CPROVER_assert(__CPROVER_bool assertion, const char *description);\n" "__CPROVER_bool __CPROVER_equal();\n" "__CPROVER_bool __CPROVER_same_object(const void *, const void *);\n" "__CPROVER_bool __CPROVER_invalid_pointer(const void *);\n" "__CPROVER_bool __CPROVER_is_zero_string(const void *);\n" "__CPROVER_size_t __CPROVER_zero_string_length(const void *);\n" "__CPROVER_size_t __CPROVER_buffer_size(const void *);\n" "__CPROVER_bool __CPROVER_get_flag(const void *, const char *);\n" "void __CPROVER_set_must(const void *, const char *);\n" "void __CPROVER_clear_must(const void *, const char *);\n" "void __CPROVER_set_may(const void *, const char *);\n" "void __CPROVER_clear_may(const void *, const char *);\n" "void __CPROVER_cleanup(const void *, const void *);\n" "__CPROVER_bool __CPROVER_get_must(const void *, const char *);\n" "__CPROVER_bool __CPROVER_get_may(const void *, const char *);\n" "const unsigned __CPROVER_constant_infinity_uint;\n" "typedef void __CPROVER_integer;\n" "typedef void __CPROVER_rational;\n" "void __CPROVER_initialize(void);\n" "void __CPROVER_input(const char *id, ...);\n" "void __CPROVER_output(const char *id, ...);\n" "void __CPROVER_cover(__CPROVER_bool condition);\n" // concurrency-related "void __CPROVER_atomic_begin();\n" "void __CPROVER_atomic_end();\n" "void __CPROVER_fence(const char *kind, ...);\n" "__CPROVER_thread_local unsigned long __CPROVER_thread_id=0;\n" "__CPROVER_bool __CPROVER_threads_exited[__CPROVER_constant_infinity_uint];\n" "unsigned long __CPROVER_next_thread_id=0;\n" // traces "void CBMC_trace(int lvl, const char *event, ...);\n" // pointers "unsigned __CPROVER_POINTER_OBJECT(const void *p);\n" "signed __CPROVER_POINTER_OFFSET(const void *p);\n" "__CPROVER_bool __CPROVER_DYNAMIC_OBJECT(const void *p);\n" "extern unsigned char __CPROVER_memory[__CPROVER_constant_infinity_uint];\n" // malloc "void *__CPROVER_malloc(__CPROVER_size_t size);\n" "const void *__CPROVER_deallocated=0;\n" "const void *__CPROVER_dead_object=0;\n" "const void *__CPROVER_malloc_object=0;\n" "__CPROVER_size_t __CPROVER_malloc_size;\n" "__CPROVER_bool __CPROVER_malloc_is_new_array=0;\n" // for the benefit of C++ "const void *__CPROVER_memory_leak=0;\n" // this is ANSI-C "extern __CPROVER_thread_local const char __func__[__CPROVER_constant_infinity_uint];\n" // this is GCC "extern __CPROVER_thread_local const char __FUNCTION__[__CPROVER_constant_infinity_uint];\n" "extern __CPROVER_thread_local const char __PRETTY_FUNCTION__[__CPROVER_constant_infinity_uint];\n" // float stuff "__CPROVER_bool __CPROVER_isnanf(float f);\n" "__CPROVER_bool __CPROVER_isnand(double f);\n" "__CPROVER_bool __CPROVER_isnanld(long double f);\n" "__CPROVER_bool __CPROVER_isfinitef(float f);\n" "__CPROVER_bool __CPROVER_isfinited(double f);\n" "__CPROVER_bool __CPROVER_isfiniteld(long double f);\n" "__CPROVER_bool __CPROVER_isinff(float f);\n" "__CPROVER_bool __CPROVER_isinfd(double f);\n" "__CPROVER_bool __CPROVER_isinfld(long double f);\n" "__CPROVER_bool __CPROVER_isnormalf(float f);\n" "__CPROVER_bool __CPROVER_isnormald(double f);\n" "__CPROVER_bool __CPROVER_isnormalld(long double f);\n" "__CPROVER_bool __CPROVER_signf(float f);\n" "__CPROVER_bool __CPROVER_signd(double f);\n" "__CPROVER_bool __CPROVER_signld(long double f);\n" "double __CPROVER_inf(void);\n" "float __CPROVER_inff(void);\n" "long double __CPROVER_infl(void);\n" "int __CPROVER_thread_local __CPROVER_rounding_mode="+i2string(config.ansi_c.rounding_mode)+";\n" // absolute value "int __CPROVER_abs(int x);\n" "long int __CPROVER_labs(long int x);\n" "long int __CPROVER_llabs(long long int x);\n" "double __CPROVER_fabs(double x);\n" "long double __CPROVER_fabsl(long double x);\n" "float __CPROVER_fabsf(float x);\n" // arrays "__CPROVER_bool __CPROVER_array_equal(const void *array1, const void *array2);\n" "void __CPROVER_array_copy(const void *dest, const void *src);\n" "void __CPROVER_array_set(const void *dest, ...);\n" // k-induction "void __CPROVER_k_induction_hint(unsigned min, unsigned max, " "unsigned step, unsigned loop_free);\n" // manual specification of predicates "void __CPROVER_predicate(__CPROVER_bool predicate);\n" "void __CPROVER_parameter_predicates();\n" "void __CPROVER_return_predicates();\n" // pipes, write, read, close "struct __CPROVER_pipet {\n" " _Bool widowed;\n" " char data[4];\n" " short next_avail;\n" " short next_unread;\n" "};\n" "extern struct __CPROVER_pipet __CPROVER_pipes[__CPROVER_constant_infinity_uint];\n" // offset to make sure we don't collide with other fds "extern const int __CPROVER_pipe_offset;\n" "unsigned __CPROVER_pipe_count=0;\n" "\n"; // GCC junk stuff, also for ARM if(config.ansi_c.mode==configt::ansi_ct::flavourt::MODE_GCC_C || config.ansi_c.mode==configt::ansi_ct::flavourt::MODE_ARM_C_CPP) { code+=gcc_builtin_headers_generic; code+=clang_builtin_headers; // there are many more, e.g., look at // https://developer.apple.com/library/mac/#documentation/developertools/gcc-4.0.1/gcc/Target-Builtins.html if(config.ansi_c.arch=="i386" || config.ansi_c.arch=="x86_64" || config.ansi_c.arch=="x32") { code+=gcc_builtin_headers_ia32; code+=gcc_builtin_headers_ia32_2; } else if(config.ansi_c.arch=="arm64" || config.ansi_c.arch=="armel" || config.ansi_c.arch=="armhf" || config.ansi_c.arch=="arm") { code+=gcc_builtin_headers_arm; } else if(config.ansi_c.arch=="alpha") { code+=gcc_builtin_headers_alpha; } else if(config.ansi_c.arch=="mips64el" || config.ansi_c.arch=="mipsn32el" || config.ansi_c.arch=="mipsel" || config.ansi_c.arch=="mips64" || config.ansi_c.arch=="mipsn32" || config.ansi_c.arch=="mips") { code+=gcc_builtin_headers_mips; } else if(config.ansi_c.arch=="powerpc" || config.ansi_c.arch=="ppc64" || config.ansi_c.arch=="ppc64le") { code+=gcc_builtin_headers_power; } // On 64-bit systems, gcc has typedefs // __int128_t und __uint128_t -- but not on 32 bit! if(config.ansi_c.long_int_width>=64) { code+="typedef signed __int128 __int128_t;\n" "typedef signed __int128 __uint128_t;\n"; } } // this is Visual C/C++ only if(config.ansi_c.os==configt::ansi_ct::ost::OS_WIN) code+="int __noop();\n" "int __assume(int);\n"; // ARM stuff if(config.ansi_c.mode==configt::ansi_ct::flavourt::MODE_ARM_C_CPP) code+=arm_builtin_headers; // CW stuff if(config.ansi_c.mode==configt::ansi_ct::flavourt::MODE_CODEWARRIOR_C_CPP) code+=cw_builtin_headers; // Architecture strings ansi_c_architecture_strings(code); }
void ansi_c_internal_additions(std::string &code) { code+= "# 1 \"<built-in-additions>\"\n" "typedef __typeof__(sizeof(int)) __CPROVER_size_t;\n" "void __CPROVER_assume(__CPROVER_bool assumption);\n" "void __VERIFIER_assume(__CPROVER_bool assumption);\n" "void assert(__CPROVER_bool assertion);\n" "void __CPROVER_assert(__CPROVER_bool assertion, const char *description);\n" "__CPROVER_bool __CPROVER_equal();\n" "__CPROVER_bool __CPROVER_same_object(const void *, const void *);\n" "__CPROVER_bool __CPROVER_is_zero_string(const void *);\n" "__CPROVER_size_t __CPROVER_zero_string_length(const void *);\n" "__CPROVER_size_t __CPROVER_buffer_size(const void *);\n" "const unsigned __CPROVER_constant_infinity_uint;\n" "typedef void __CPROVER_integer;\n" "typedef void __CPROVER_rational;\n" "void __CPROVER_initialize(void);\n" "void __CPROVER_input(const char *id, ...);\n" "void __CPROVER_output(const char *id, ...);\n" "void __CPROVER_cover(__CPROVER_bool condition);\n" // concurrency-related "void __CPROVER_atomic_begin();\n" "void __CPROVER_atomic_end();\n" "void __CPROVER_fence(const char *kind, ...);\n" "unsigned long long __CPROVER_threads_exited=0;\n" "unsigned long __CPROVER_next_thread_id=0;\n" // traces "void CBMC_trace(int lvl, const char *event, ...);\n" // pointers "unsigned __CPROVER_POINTER_OBJECT(const void *p);\n" "signed __CPROVER_POINTER_OFFSET(const void *p);\n" "__CPROVER_bool __CPROVER_DYNAMIC_OBJECT(const void *p);\n" "extern unsigned char __CPROVER_memory[__CPROVER_constant_infinity_uint];\n" // malloc "void *__CPROVER_malloc(__CPROVER_size_t size);\n" "const void *__CPROVER_deallocated=0;\n" "const void *__CPROVER_malloc_object=0;\n" "__CPROVER_size_t __CPROVER_malloc_size;\n" "__CPROVER_bool __CPROVER_malloc_is_new_array=0;\n" // for the benefit of C++ // this is ANSI-C "extern __CPROVER_thread_local const char __func__[__CPROVER_constant_infinity_uint];\n" // this is GCC "extern __CPROVER_thread_local const char __FUNCTION__[__CPROVER_constant_infinity_uint];\n" "extern __CPROVER_thread_local const char __PRETTY_FUNCTION__[__CPROVER_constant_infinity_uint];\n" // float stuff "__CPROVER_bool __CPROVER_isnan(double f);\n" "__CPROVER_bool __CPROVER_isfinite(double f);\n" "__CPROVER_bool __CPROVER_isinf(double f);\n" "__CPROVER_bool __CPROVER_isnormal(double f);\n" "__CPROVER_bool __CPROVER_sign(double f);\n" "double __CPROVER_inf(void);\n" "float __CPROVER_inff(void);\n" "long double __CPROVER_infl(void);\n" "extern int __CPROVER_thread_local __CPROVER_rounding_mode;\n" // absolute value "int __CPROVER_abs(int x);\n" "long int __CPROVER_labs(long int x);\n" "double __CPROVER_fabs(double x);\n" "long double __CPROVER_fabsl(long double x);\n" "float __CPROVER_fabsf(float x);\n" // arrays "__CPROVER_bool __CPROVER_array_equal(const void *array1, const void *array2);\n" "void __CPROVER_array_copy(const void *dest, const void *src);\n" "void __CPROVER_array_set(const void *dest, ...);\n" // k-induction "void __CPROVER_k_induction_hint(unsigned min, unsigned max, " "unsigned step, unsigned loop_free);\n" // manual specification of predicates "void __CPROVER_predicate(__CPROVER_bool predicate);\n" "void __CPROVER_parameter_predicates();\n" "void __CPROVER_return_predicates();\n" "\n"; // GCC junk stuff, also for ARM if(config.ansi_c.mode==configt::ansi_ct::MODE_GCC || config.ansi_c.mode==configt::ansi_ct::MODE_ARM) { code+=gcc_builtin_headers_generic; // there are many more, e.g., look at // https://developer.apple.com/library/mac/#documentation/developertools/gcc-4.0.1/gcc/Target-Builtins.html switch(config.ansi_c.arch) { case configt::ansi_ct::ARCH_I386: case configt::ansi_ct::ARCH_X86_64: code+=gcc_builtin_headers_ia32; break; case configt::ansi_ct::ARCH_ARM: code+=gcc_builtin_headers_arm; break; case configt::ansi_ct::ARCH_ALPHA: code+=gcc_builtin_headers_alpha; break; case configt::ansi_ct::ARCH_MIPS: code+=gcc_builtin_headers_mips; break; case configt::ansi_ct::ARCH_POWER: code+=gcc_builtin_headers_power; break; default:; } // On 64-bit systems, gcc has typedefs // __int128_t und __uint128_t -- but not on 32 bit! if(config.ansi_c.long_int_width>=64) { code+="typedef signed __int128 __int128_t;\n" "typedef signed __int128 __uint128_t;\n"; } } // this is Visual C/C++ only if(config.ansi_c.os==configt::ansi_ct::OS_WIN) code+="int __noop();\n" "int __assume(int);\n"; // ARM stuff if(config.ansi_c.mode==configt::ansi_ct::MODE_ARM) code+=arm_builtin_headers; // CW stuff if(config.ansi_c.mode==configt::ansi_ct::MODE_CODEWARRIOR) code+=cw_builtin_headers; // Architecture strings ansi_c_architecture_strings(code); }
void cpp_internal_additions(std::ostream &out) { out << "# 1 \"<built-in>\"" << '\n'; // new and delete are in the root namespace! out << "void operator delete(void *);" << '\n'; out << "void *operator new(__typeof__(sizeof(int)));" << '\n'; // auxiliaries for new/delete out << "extern \"C\" void *__new(__typeof__(sizeof(int)));" << '\n'; // NOLINTNEXTLINE(whitespace/line_length) out << "extern \"C\" void *__new_array(__typeof__(sizeof(int)), __typeof__(sizeof(int)));" << '\n'; // NOLINTNEXTLINE(whitespace/line_length) out << "extern \"C\" void *__placement_new(__typeof__(sizeof(int)), void *);" << '\n'; // NOLINTNEXTLINE(whitespace/line_length) out << "extern \"C\" void *__placement_new_array(__typeof__(sizeof(int)), __typeof__(sizeof(int)), void *);" << '\n'; out << "extern \"C\" void __delete(void *);" << '\n'; out << "extern \"C\" void __delete_array(void *);" << '\n'; out << "extern \"C\" bool __CPROVER_malloc_is_new_array=0;" << '\n'; // __CPROVER namespace out << "namespace __CPROVER { }" << '\n'; // types out << "typedef __typeof__(sizeof(int)) __CPROVER::size_t;" << '\n'; out << "typedef __typeof__(sizeof(int)) __CPROVER_size_t;" << '\n'; // assume/assert out << "extern \"C\" void assert(bool assertion);" << '\n'; out << "extern \"C\" void __CPROVER_assume(bool assumption);" << '\n'; out << "extern \"C\" void __CPROVER_assert(" "bool assertion, const char *description);" << '\n'; out << "extern \"C\" void __CPROVER::assume(bool assumption);" << '\n'; out << "extern \"C\" void __CPROVER::assert(" "bool assertion, const char *description);" << '\n'; // CPROVER extensions out << "extern \"C\" const unsigned __CPROVER::constant_infinity_uint;\n"; out << "extern \"C\" void __CPROVER_initialize();" << '\n'; out << "extern \"C\" void __CPROVER::input(const char *id, ...);" << '\n'; out << "extern \"C\" void __CPROVER::output(const char *id, ...);" << '\n'; out << "extern \"C\" void __CPROVER::cover(bool condition);" << '\n'; out << "extern \"C\" void __CPROVER::atomic_begin();" << '\n'; out << "extern \"C\" void __CPROVER::atomic_end();" << '\n'; // pointers out << "extern \"C\" unsigned __CPROVER_POINTER_OBJECT(const void *p);\n"; out << "extern \"C\" signed __CPROVER_POINTER_OFFSET(const void *p);" << '\n'; out << "extern \"C\" bool __CPROVER_DYNAMIC_OBJECT(const void *p);" << '\n'; // NOLINTNEXTLINE(whitespace/line_length) out << "extern \"C\" extern unsigned char __CPROVER_memory[__CPROVER::constant_infinity_uint];" << '\n'; out << "extern \"C\" const void *__CPROVER_dead_object=0;" << '\n'; // malloc out << "extern \"C\" void *__CPROVER_malloc(__CPROVER::size_t size);" << '\n'; out << "extern \"C\" const void *__CPROVER_deallocated=0;" << '\n'; out << "extern \"C\" const void *__CPROVER_malloc_object=0;" << '\n'; out << "extern \"C\" __CPROVER::size_t __CPROVER_malloc_size;" << '\n'; // float out << "extern \"C\" int __CPROVER_rounding_mode;" << '\n'; // arrays // NOLINTNEXTLINE(whitespace/line_length) out << "bool __CPROVER::array_equal(const void array1[], const void array2[]);" << '\n'; out << "void __CPROVER::array_copy(const void dest[], const void src[]);\n"; out << "void __CPROVER::array_set(const void dest[], ...);" << '\n'; // GCC stuff, but also for ARM if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC || config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE || config.ansi_c.mode==configt::ansi_ct::flavourt::ARM) { out << "extern \"C\" {" << '\n'; out << c2cpp(gcc_builtin_headers_generic); out << c2cpp(gcc_builtin_headers_math); out << c2cpp(gcc_builtin_headers_mem_string); out << c2cpp(gcc_builtin_headers_omp); out << c2cpp(gcc_builtin_headers_tm); out << c2cpp(gcc_builtin_headers_ubsan); out << c2cpp(clang_builtin_headers); if(config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE) out << "typedef double __float128;\n"; // clang doesn't do __float128 out << c2cpp(gcc_builtin_headers_ia32); out << c2cpp(gcc_builtin_headers_ia32_2); out << c2cpp(gcc_builtin_headers_ia32_3); out << c2cpp(gcc_builtin_headers_ia32_4); out << "}" << '\n'; } // extensions for Visual C/C++ if(config.ansi_c.os==configt::ansi_ct::ost::OS_WIN) out << "extern \"C\" int __noop(...);\n"; // string symbols to identify the architecture we have compiled for std::string architecture_strings; ansi_c_architecture_strings(architecture_strings); out << "extern \"C\" {" << '\n'; out << architecture_strings; out << "}" << '\n'; // Microsoft stuff if(config.ansi_c.mode==configt::ansi_ct::flavourt::VISUAL_STUDIO) { // type_info infrastructure -- the standard wants this to be in the // std:: namespace, but MS has it in the root namespace out << "class type_info;" << '\n'; // this is the return type of __uuidof(...), // in the root namespace out << "struct _GUID;" << '\n'; // MS ATL-related stuff out << "namespace ATL; " << '\n'; out << "void ATL::AtlThrowImpl(long);" << '\n'; out << "void __stdcall ATL::AtlThrowLastWin32();" << '\n'; } out << std::flush; }
void ansi_c_internal_additions(std::string &code) { code+= "typedef __typeof__(sizeof(int)) __CPROVER_size_t;\n" "void __CPROVER_assume(_Bool assumption);\n" "void __VERIFIER_assume(_Bool assumption);\n" "void assert(_Bool assertion);\n" "void __CPROVER_assert(_Bool assertion, const char *description);\n" "_Bool __CPROVER_equal();\n" "_Bool __CPROVER_same_object(const void *, const void *);\n" "_Bool __CPROVER_is_zero_string(const void *);\n" "__CPROVER_size_t __CPROVER_zero_string_length(const void *);\n" "__CPROVER_size_t __CPROVER_buffer_size(const void *);\n" "const unsigned __CPROVER_constant_infinity_uint;\n" "typedef void __CPROVER_integer;\n" "typedef void __CPROVER_rational;\n" "void __CPROVER_initialize(void);\n" "void __CPROVER_input(const char *id, ...);\n" "void __CPROVER_output(const char *id, ...);\n" "void __CPROVER_cover(_Bool condition);\n" "void __CPROVER_atomic_begin();\n" "void __CPROVER_atomic_end();\n" // traces "void CBMC_trace(int lvl, const char *event, ...);\n" // pointers "unsigned __CPROVER_POINTER_OBJECT(const void *p);\n" "signed __CPROVER_POINTER_OFFSET(const void *p);\n" "_Bool __CPROVER_DYNAMIC_OBJECT(const void *p);\n" "extern unsigned char __CPROVER_memory[__CPROVER_constant_infinity_uint];\n" // malloc "void *__CPROVER_malloc(__CPROVER_size_t size);\n" "const void *__CPROVER_deallocated=0;\n" "const void *__CPROVER_malloc_object=0;\n" "__CPROVER_size_t __CPROVER_malloc_size;\n" "_Bool __CPROVER_malloc_is_new_array=0;\n" // for the benefit of C++ // this is ANSI-C "extern __CPROVER_thread_local const char __func__[__CPROVER_constant_infinity_uint];\n" // this is GCC "extern __CPROVER_thread_local const char __FUNCTION__[__CPROVER_constant_infinity_uint];\n" "extern __CPROVER_thread_local const char __PRETTY_FUNCTION__[__CPROVER_constant_infinity_uint];\n" // float stuff "_Bool __CPROVER_isnan(double f);\n" "_Bool __CPROVER_isfinite(double f);\n" "_Bool __CPROVER_isinf(double f);\n" "_Bool __CPROVER_isnormal(double f);\n" "_Bool __CPROVER_sign(double f);\n" "extern int __CPROVER_rounding_mode;\n" // absolute value "int __CPROVER_abs(int x);\n" "long int __CPROVER_labs(long int x);\n" "double __CPROVER_fabs(double x);\n" "long double __CPROVER_fabsl(long double x);\n" "float __CPROVER_fabsf(float x);\n" // arrays "_Bool __CPROVER_array_equal(const void array1[], const void array2[]);\n" "void __CPROVER_array_copy(const void dest[], const void src[]);\n" "void __CPROVER_array_set(const void dest[], ...);\n" // k-induction "void __CPROVER_k_induction_hint(unsigned min, unsigned max, " "unsigned step, unsigned loop_free);\n" // manual specification of predicates "void __CPROVER_predicate(_Bool predicate);\n" "void __CPROVER_parameter_predicates();\n" "void __CPROVER_return_predicates();\n" // GCC junk stuff GCC_BUILTIN_HEADERS "\n"; if(config.ansi_c.os==configt::ansi_ct::OS_WIN) code+="int __noop();\n"; // this is Visual C/C++ // ARM stuff if(config.ansi_c.mode==configt::ansi_ct::MODE_ARM) code+=ARM_BUILTIN_HEADERS; // Architecture strings ansi_c_architecture_strings(code); }