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близко, fchown, fork, fsync, getlogin, getuid, geteuid, getgid, lchown, link, pipeчтение, pread, resolvepath, setuid, setegid, seteuid, setgid, sleep, sync, symlink, ttyname, unlink, vforkзапись, pwriteоткрытый, creat, sigsetjmp, __sigsetjmp, и siglongjmpare.