Некоторые функции могут быть объявлены внутри 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.