Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}