Ошибки упругости Lib C

Функции Extern 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 флаг). Эта опция отключает только внутренние номера стандартного 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.