Как пометить функцию как не возвращающуюся в тесте Parasoft C ++? - PullRequest
4 голосов
/ 19 апреля 2011

У нас есть функция die, которая выводит сообщение об ошибке и завершает работу, например ::10000

void die(const char* msg) {
    fprintf(stderr, "Error: %s\n", msg);
    exit(1);
}

Мы используем Parasoft C ++ test для статического анализа нашего кода, но он не осознает, что die является невозвратной функцией. Поэтому, когда он видит код вроде:

void foo(Bar* bar) {
    if(!bar) {
        die("bar is NULL");
    }
    Bar bar2 = *bar;
}

Он предупреждает, что *bar может разыменовать нулевой указатель, даже если bar, будучи NULL, помешает выполнению этой строки. Есть ли способ пометить die как невозвратный способом, который Parasoft распознал бы?


Редактировать : Мне нужно что-то, что работает как в GCC, так и в VS 2003, но я не выше #ifdef разбираюсь во всем, если у кого-то есть решение, которое работает только в VS

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

Я понял это.Оказывается, в Parasoft есть встроенный список NRF, которые вы можете настроить;они называются «завершающими функциями».Вы можете редактировать их через графический интерфейс VS или через файл конфигурации, если вы запускаете Parasoft вне VS

Через Visual Studio

Через файл конфигурации

Добавить строки, подобные следующим:

com.parasoft.xtest.checker.flowanalysis.terminators.api0.methods=active\=true|name\=die|type\=*|paramsn\=*|defsInSubClasses\=true;
com.parasoft.xtest.checker.flowanalysis.terminators.apis=active\=true|name\=foo;
2 голосов
/ 19 апреля 2011

В gcc вы должны присвоить функции что-то вроде:

     die (const char *, ...) 
          __attribute__ ((format_arg (1)))
          __attribute__ ((noreturn))
1 голос
/ 19 апреля 2011

Если вы используете Visual Studio 2005+, вы можете использовать __declspec(noreturn) следующим образом:

__declspec(noreturn) void die(char const* msg){
  fprntf(stderr, "Error: %s\n"; msg);
  exit(1);
}

Возможно, это поможет Parasoft распознать функцию как невозвратную.
Редактировать: GCC имеет __attribute__((noreturn)) (первый пример).

...