2014-10-28 3 views
0

я поддерживать некоторые уродливые унаследованного кода с помощью следующей функции, и я получаюЛожное «значение, рассчитанное не используется» предупреждение

warning: value computed is not used 

для линий, обозначенных комментариях ниже:

void ReadKeyValuePipe(char* buffer, char* key, char* value) { 
    char* pos; 
    char key_str[1024]; 
    char* val = value; 
    sprintf(key_str,"%s:",key); 
    if((pos = strstr(buffer,key))) { 
     pos += strlen(key_str); 
     while (*pos && *pos != '|') { 
      *val = *pos; 
      *val++; // this is actually used 
      *pos++; // so is this 
     } 
     *val = 0; 
    } 
} 

Когда я удаляю эти строки, код прерывается. Это имеет смысл, поскольку они, как представляется, увеличивают маркеры.

Как я могу заставить компилятор признать, что эти вычисления фактически используются?

+1

Они не используются - см связанный дубликат. – BartoszKP

+0

Я бы больше беспокоился о переполнении скрытого буфера из вызова 'sprintf'. По крайней мере, бросьте в 'assert (strlen (key) + 2 <= sizeof (key_str))' – Casey

+0

@Casey Вся эта функция кажется неправильным способом сделать это для меня, но я должен выбрать свои битвы. –

ответ

4

Вы разыменования val и pos, а затем приращением их, но вы никогда не использовали результат разыменования. Вы можете просто заменить эти строки с:

*val = *pos; 
++val; 
++pos; 

Или, возможно, что код изначально был раньше кто-то «фиксированной» это:

*val++ = *pos++; 
1

Вы можете использовать опцию компилятора -Wno-unused-value, если вы уверены, что ваш код верен. Что нет, поскольку вы, очевидно, не знаете, что делает *val++;.

*val++; 
*pos++; 

так же, как:

val++; 
pos++; 
+1

Проблема с этим подходом заключается в том, что этот уродливый код устаревшего кода и мои новые дополнения иногда имеют фактические неиспользованные значения, и я полагаюсь на предупреждения, чтобы их распознать и устранить. (Я не был тем, кто проголосовал за вас). –

+0

Вы можете применить '-Wno-unused-value' только к нескольким строкам кода с проблемой, используя подход' pragma GCC diagnostic ignored' – Walter

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