Lib C, блокирующий ошибки

Функции экстерна К

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

Функциональные ограничения на некоторых заблокированных стандартных функциях ANSI

  • 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.