2015-09-04 3 views
2

Я ищу флаг компилятора для gcc и, если возможно, для clang и компиляторов Microsoft, который запускает предупреждение (ошибка с -Werror), если функция не-void вызывается без использования возвращаемого значения, как это:Как обеспечить использование возвращаемых значений в C

int test() { 
    return 4; 
} 

int main(void) { 
    test(); //should trigger a warning 
    int number = test(); //shouldn't trigger the warning 
    return 0; 
} 

Если нет такого компилятора флаг, может быть какой-то способ сказать лязг статический анализатор сетовать об этом.

EDIT: Чтобы уточнить мой первоначальный вопрос: на самом деле я имел в виду использование возвращаемого значения, а не только его назначение.

+1

Примечание. Используйте 'int main (void)' вместо 'void'. , – ameyCU

+2

Это вызовет массу ненужных предупреждений. Например, каждый вызов 'printf()' генерирует жалобу - они возвращают количество напечатанных символов, но никто не заботится. – Barmar

+0

@Barmar, я мог видеть, где это может быть удобно для не-библиотечных функций. Когда я добавляю возвращаемое значение к ранее недействительной функции, я должен изменить остальную часть подписи, чтобы выследить все места, которые ее используют. – Leeor

ответ

8

Я никогда не использовал его сам (вы действительно это нужно?), вы можете попробовать

  • определения функции с атрибутом warn_unused_result
  • позволяет -Wunused-result флаг с gcc.

Это расскажет вам о любом неиспользованном значении из функции return.


В случае, если какое-либо сомнение, SEE IT LIVE или SEE IT LIVE AGAINБлагодаря M.M для ссылки в комментариях

Или:

#include <stdio.h> 

extern int func1(void) __attribute__((warn_unused_result)); 
extern int func2(void); 

int main(void) 
{ 
    func1(); 
    int rc1 = func1(); 
    int rc2 = func1(); 
    func2(); 
    printf("%d\n", rc1); 
    return 0; 
} 

компиляция (GCC 5.1.0 на Mac OS X 10.10.5):

$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -c warn.c 
warn.c: In function ‘main’: 
warn.c:10:9: error: unused variable ‘rc2’ [-Werror=unused-variable] 
    int rc2 = func1(); 
     ^
warn.c:8:5: error: ignoring return value of ‘func1’, declared with attribute warn_unused_result [-Werror=unused-result] 
    func1(); 
    ^
cc1: all warnings being treated as errors 
$ 
+2

@ Andreas: Почему вы так думаете? –

+3

Это будет предупреждать, если он присваивает результат переменной, но не использует переменную. Он хочет получить предупреждение, когда он не присваивает результат переменной. – Barmar

+2

@ Бармар: ты уверен? Я думаю, что предупреждение «переменная, но не используется» является отдельным. –

1

Некоторые статические анализаторы кода, как splint может проверить для такого рода вещей:

$ splint check.c 
Splint 3.1.2 --- 03 May 2009 

check.c: (in function main) 
check.c:6:5: Return value (type int) ignored: test() 
    Result returned by function call is not used. If this is intended, can cast 
    result to (void) to eliminate message. (Use -retvalint to inhibit warning) 

В отличие от @ ответ Sourav, это не требует конкретного __attribute__ аннотацию на целевую функцию, но с другой стороны, возможно, испускает много предупреждений. Его обычно можно подавить предупреждения для определенных функций или вызовов функций, используя аннотации (например, /*@alt [email protected]*/).

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