Некоторые функции могут быть объявлены в блоке extern "C" { }
в некоторых файлах, но не в других. В этом случае связь отличается, который вызывает ошибку ссылки, потому что она запрещается стандартом ANSI®.
Оригинальный код:
extern "C" { void* memcpy(void*, void*, int); } class Copy { public: Copy() {}; static void* make(char*, char*, int); }; void* Copy::make(char* dest, char* src, int size) { return memcpy(dest, src, size); }
Сообщение об ошибке:
Pre-linking C++ sources ... <results_dir>/test.cpp, line 2: error: declaration of function "memcpy" is incompatible with a declaration in another translation unit (parameters do not match) | the other declaration is at line 4096 of "__polyspace__stdstubs.c" | void* memcpy(void*, void*, int); | ^ | detected during compilation of secondary translation unit "test.cpp"
Функциональный memcpy
объявляется, когда внешний "C" функционирует и как функцию C++. Это вызывает проблему ссылки. Действительно, функциональное поведение управления отличается, относится ли оно к C или функции C++.
Когда такая ошибка происходит, решение состоит в том, чтобы гомогенизировать объявления, т.е. добавить, что extern "C" { }
вокруг предыдущего перечислил функции C.
Другое решение состоит в использовании разрешающей опции -no-extern-C
. Это удаляет все объявления extern "C"
.
signal.h
заблокирован с функциональными ограничениями: signal
и функции raise
не следуют за связанной функциональной моделью. Даже если функциональное повышение называется, сохраненный указатель функции, сопоставленный к номеру сигнала, не называется.
Никакой скачок не выполняется, даже если setjmp
и функции longjmp
называются.
errno.h
частично заблокирован. Некоторые математические функции не устанавливают errno
, но вместо этого, генерируют красную ошибку, когда область значений или доменная ошибка происходят при проверках ASRT.
Можно также использовать опцию компиляции POLYSPACE_STRICT_ANSI_STANDARD_STUBS
(флаг -D
). Эта опция только деактивировала расширения ANSI C стандарт libC, включая функции bzero
, bcopy
, bcmp
, chdir
, chown
, close
, fchown
, fork
, fsync
, getlogin
, getuid
, geteuid
, getgid
, lchown
, link
, pipe
, read
, pread
, resolvepath
, setuid
, setegid
, seteuid
, setgid
, sleep
, sync
, symlink
, ttyname
, unlink
, vfork
, write
, pwrite
, open
, creat
, sigsetjmp
, __sigsetjmp
и siglongjmpare
.