2014-08-27 1 views
4

GCC услужливо предупредит вас, если вы забыли включить часовой NULL в конце вызова одной из функций: exec(3)Отсутствует «отсутствуют сторожевое» предупреждение для Exec в C++ 11

#include <unistd.h> 
int main(int argc, char **argv) 
{ 
    execlp("test", "test", "arg1"); 
} 

Sample выход для компилятора GCC 4.8:

$ g++ test.cc -Wformat 
test.cc: In function ‘int main(int, char**)’: 
test.cc:4:32: warning: missing sentinel in function call [-Wformat=] 
    execlp("test", "test", "arg1"); 
          ^
$ 

Однако, если вы собираете в C++ 11 режима, нет диагностики не печатается:

$ g++ test.cc -std=c++11 -Wformat 
$ 

Почему это предупреждение недоступно в C++ 11? Есть ли способ вернуть его?

+0

То же самое происходит с '-std = C++ 98'. – trojanfoe

+3

Вам нужно что-то вроде '-std = gnuXX' (по умолчанию 98). –

+0

Действительно, '-std = gnu11' возвращает предупреждения. – trojanfoe

ответ

4

execlp не является стандартной функцией C. Чтобы компилятор распознал его как «стандартную» функцию, для которой он знает, как должны выглядеть аргументы, вам нужно -std=gnu++11 вместо -std=c++11. Обратите внимание, что по умолчанию -std=gnu++98. Glibc мог улучшить ситуацию, указав атрибут sentinel при объявлении execlp.

Смежные вопросы