Как минимум один из комментариев гласит: «Компилятор должен предупредить об этом».Я настоятельно рекомендую вам сделать компилятором, предупреждающим вас об этом.:) Позволь мне объяснить.
YMMV для других платформ, но в Unix можно установить для переменной среды CFLAGS включение по умолчанию предупреждений при использовании утилиты make
с неявными правилами.
Ниже приведена стенограмма из моего сеанса bash, где я вставляю ваш код в файл, компилирую с make
, а затем добавляю оптимизацию в переменную CFLAGS и перекомпилирую, чтобы увидеть, дает ли это больше предупреждений.
503(1)06:22 PM:~ 0> cat >sostr.c
#include <stdio.h>
int main()
{
/* A nice long string */
char string[256];
int i;
printf( "Please enter a long string: " );
/* notice stdin being passed in */
fgets ( string, 256, stdin );
for( i = 0; i < 256; i++)
{
if( string[i] == 'a' )
{
string[i] == 'x';
printf("%s", "foo");
}
}
printf( "You entered a very long string, %s", string );
getchar();
}
504(1)06:22 PM:~ 0> make sostr
cc -g -Wall sostr.c -o sostr
sostr.c: In function 'main':
sostr.c:15: warning: statement with no effect
sostr.c:21: warning: control reaches end of non-void function
505(1)06:22 PM:~ 0> export CFLAGS+=' -O2'
506(1)06:23 PM:~ 0> touch sostr.c
507(1)06:23 PM:~ 0> make sostr
cc -g -Wall -O2 sostr.c -o sostr
sostr.c: In function 'main':
sostr.c:15: warning: statement with no effect
sostr.c:21: warning: control reaches end of non-void function
508(1)06:23 PM:~ 0>
Еще один инструмент для получения большого количества предупреждений - splint
;хотя это часто слишком придирчиво.
509(1)06:33 PM:~ 0> splint sostr.c
Splint 3.1.2 --- 23 Aug 2008
sostr.c: (in function main)
sostr.c:9:1: Return value (type char *) ignored: fgets(string, 25...
Result returned by function call is not used. If this is intended, can cast
result to (void) to eliminate message. (Use -retvalother to inhibit warning)
sostr.c:15:21: Statement has no effect: string[i] == 'x'
Statement has no visible effect --- no values are modified. (Use -noeffect to
inhibit warning)
sostr.c:20:3: Return value (type int) ignored: getchar()
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)
sostr.c:21:2: Path with no return in function declared to return int
There is a path through a function declared to return a value on which there
is no return statement. This means the execution may fall through without
returning a meaningful result to the caller. (Use -noret to inhibit warning)
Finished checking --- 4 code warnings
510(1)06:34 PM:~ 1>
Так что оба эти метода ловят одну и ту же строку 15 == / = problem.Оба также предупреждают вас, что main должен вернуть 0;если успешно.И splint также жалуется, что вы игнорируете возвращаемые значения из fgets
и getchar
.Похоже, вы действительно хотите игнорировать результат getchar
, поэтому я рекомендую написать (void)getchar();
, чтобы показать, что значение намеренно игнорируется.Однако это не относится к fgets
.Я предлагаю вам использовать возвращаемое значение или оставить предупреждение (вероятно, для этого игрушечного кода можно игнорировать значение).Проверка возвращаемого значения может быть важной в других программах, поэтому не стоит начинать помечать их (void)
.