Некоторые функции могут быть объявлены внутри 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
флаг). Эта опция отключает только внутренние номера стандартного libC ANSI C, включая функции 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
.