Так как функция stripCRLF
изменяет строку на месте, но ничего с ней не делает и не возвращает никакого значения, передача строкового литерала ему по сути является запретом и должна рассматриваться как ошибка. Вы можете решить эту проблему, изменив и вернув копию строки, или установив более строгие флаги предупреждения, чтобы помочь определить, когда это происходит.
Если вы хотите, чтобы gcc предупреждал вас о подобных вещах, включите опцию -Wwrite-strings
compiler. Это заставит компилятор предупреждать вас, если строковая константа преобразуется в непостоянную char*
. Также возможно полезным является параметр -Wcast-qual
; это должно выдавать предупреждение всякий раз, когда указатель приведен таким образом, который удаляет спецификатор типа (в вашем случае, const
был удален). Если вы хотите, чтобы эти сообщения делались более строго, используйте -Werror
, чтобы превратить все предупреждения в ошибки.
Другим предметом спора является функция FindArgDefault
. Как предусмотрено, сигнатура функции должна более точно использовать const char*
вместо char*
для типов возврата и параметров. Это должно привести к тому, что компилятор будет жаловаться, когда возвращаемое значение назначено char*
(если используется опция -Wcast-qual
). Поскольку вы не опубликовали полную функцию, это может быть недопустимым изменением. Если какая-либо строка изменяется внутри функции, то соответствующий параметр должен оставаться char*
, но в этом случае передача строкового литерала в качестве аргумента должна сгенерировать предупреждение компилятора (используйте -Wwrite-strings
).
Кстати, ваша функция stripCRLF
уязвима для проблем, когда передается указатель NULL. Кроме того, вы хотели сказать if (delim == -1)
, или это должно быть !=
?
Редактировать: После просмотра дополнительной информации о сообщениях об ошибках, которые получает ОП, я удалил части исходного поста, которые были не по теме, и добавил некоторые дополнительные комментарии.
Edit2: Я протестировал следующую упрощенную версию вашей программы:
char *FindArgDefault(char *argName, char *defVal) {
char * val = defVal;
return(val);
}
int main (void) {
char * host = FindArgDefault("EMailLinkHost", "");
return (int)(host);
}
Когда я компилировал с gcc -Wall test.c -o test.o
, я получал ноль предупреждений или ошибок компилятора.
Когда я скомпилировал с gcc -Wwrite-strings -Wall test.c -o test.o
, я получил
test.c: в функции 'main':
test.c: 10: предупреждение: передача аргумента 1 из FindArgDefault отбрасывает квалификаторы из целевого типа указателя
test.c: 10: предупреждение: передача аргумента 2 из FindArgDefault отбрасывает квалификаторы из целевого типа указателя
Я определенно думаю, что опцию компилятора -Wwrite-strings
вы хотите включить, чтобы предупредить вас о подобных проблемах.