Как стать автором
Обновить

Комментарии 9

Мне кажется, такое сообщение от анализатора для начинающего вообще ничем не лучше шаблонной абракадабры или падения программы. Слишком далеко до решения, слишком много надо знать, чтобы понять сообщение анализатора и придумать решение.

Пример "наивных" рассуждений:

char *buffer = malloc(sizeof(char) * 100);

Я выделил память под строчку.

buffer = "hello world !\n";

Я скопировал строчку. Но почему-то не работает, причём ломается где-то потом.

The 'malloc' function is not declared. Passing data to or from this function can be affected.

Чиво. Но у меня-то выделяется и почти работает => значит, не affected.

Кстати, чтобы исправить проблему, надо знать, что такое "function is not declared", как объявлять функции, и почему malloc на самом деле надо объявлять не так, а через #include, причём ещё знать, какой именно.

V773 The 'buffer' pointer was assigned values twice without releasing the memory. A memory leak is possible.

Ну possible и possible, меня это не волнует, у меня программа не работает. Да и память я в конце освобождаю, так что всё честно.

В сообщении идёт акцент либо на "утечку памяти" (что в этом примере вообще неважно и лишь сбивает с толку), либо на "двойное присваивание", что совершенно не помогает: автор вопроса хочет сначала выделить буфер, а потом скопировать туда строчку - это действительно по смыслу два каких-то "типа-присваивания". Просто так сложилось, что одно из них почему-то должно быть =, а другое должно быть strcpy, а компилятор сам и не догадывается. Но про strcpy анализатор ничего не говорит.

Да и причина падения-то на самом деле не в утечке памяти и не в переприсваивании, а в использовании free на статически выделенной строчке. Но как определить "что подразумевал программист" тут совершенно непонятно - то ли strcpy нужен, то ли malloc/free не нужен.

Предупреждения статического анализатора (и компилятора) - это повод задуматься. И почитать хотя-бы те-же описания диагностик PVS-Studio. Там вполне можно узнать свою ситуацию.

Если предупреждения компилятора/анализатора воспринимаются как шум и "автору виднее"... Ну что же. Ему пока ему предстоит продолжить путь страданий :)

Если бы студент хотел призадуматься, он бы не писал вопрос на SO :)

P.S.

Проверять лень, но я уверен, что -Wall -Wextra -Werror решили бы проблему не хуже PVS Studio)

Ну или я что-то не так сделал, или не очень помогает.

Да, с -Wall -Wextra -Werror код не компилируется из-за malloc.

Но если добавить #include <stdlib.h>, то компилируется без проблем и ошибка с порчей указателя не находится.

Так если плохой код не компилируется - это же вроде как уже хорошо. Уже повод задуматься: "а всё ли я делаю правильно?" :)

В конечном итоге -fsanitize=address:)

Так что такой способ поиска ошибок вполне может помочь в процессе обучения.

Не поможет. Обучающийся студент/программист не поймет что ваш инструмент ему сообщает. Вы на разных с ним языках говорите. Для него ваши сообщения что послания с альфа центавры - такая же марсианская абракадабра.

Вы же не пишите ему на простом человеческом языке: "эй, парень, смотри на строчку %1 - ты там выделяешь память в переменную buffer. В строчке %2 ты в эту переменную присваиваешь указатель на другой участок памяти. Тут тебе надо по хорошему strcpy использовать. А падает твоя прога потому что в строке %3 ты вызываешь функцию free передавая в нее не тот адрес памяти который ты выделил в %1, а совершенно другой. Смекаешь?"

О! То, что PVS studio есть в CE очень круто, но поводу диагностики этого конкретного случая - слабовато.

Запустите clang-tidy (бесплатный, и доступный в большинстве IDE) и вывод будет гораздо полезнее (особенно для начинающего - можно сразу копировать в ответ на SO) и сразу к делу.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий