Comments 19
Ещё не суйте сырые руки в щиток.
Но! Если написать маркером "UNSAFE" на руке, то можно. Новомодные языки такое практикуют.
Тот, кто в 21 веке пишет на C, вероятно, знает что и зачем он делает.
В большинстве случаев на Си пишут для встраиваемых систем, а у них объем памяти фиксирован и заранее известен, поэтому нет необходимости использовать динамическое выделение памяти. По этой же причине можно использовать глобальные переменные и полностью отказаться от указателей. Большая часть описанных в статье проблем теряют актуальность.
код на С хорошо переносится.
Прекрасные примеры, которые поймает статический анализатор, а есть что поинтереснее?
Вы устали от:❌ Тайных утечек памяти, которые пожирают ресурсы.
❌ Загадочных падений программы без объяснения причин.
❌ Указателей-призраков, стреляющих в вас из темноты сегфолтов.
Для кого:
• Начинающие разработчики, которые хотят писать код, а не баги.
• Те, кто считает, что free() — это про свободу, а не про память.
• Все, кто устал гуглить «почему Си опять вылетает».
Взаимоисключающие параграфы, тем более после прочтения статьи. Любой уважающий себя автор сишного букваря (или цикла уроков) эти "ошибки" озвучит в начале соответствующих тем.
ChatGPT мне по этому промту (название статьи) информации больше накидал и подробнее. Только он не боялся слова "разыменование" и не путал тестирование с профилированием и отладкой.
Выход за границы массива
Как избежать:
Используйте константы
Так?
#define ARRAY_SIZE 10
/* some code */
int my_best_array[ARRAY_SIZE] = {0};
for(int i = 0; i <= ARRAY_SIZE; i++)
printf("%d\n", my_best_array[i]);
/* some code else */
или sizeof для определения размера:
Сколько нулей выведет?
void print_my_best_array(int best_array[])
{
for(int i = 0; i < sizeof(best_array); i++)
printf("%d\n", best_array[i]);
}
int main()
{
int my_best_array[10] = {0};
print_my_best_array(my_best_array);
return 0;
}
Полезные ресурсы:
Книга «Язык программирования Си» (K&R).
Документация Valgrind: https://www.valgrind.org/.
Онлайн-чекер Cppcheck: https://cppcheck.sourceforge.io/.
Можно еще ссылок на документацию к GCC и Clang дать, в статье же про Compiler Warnings было.
Ну и K&R отлично подойдет "для тех, кто считает, что free() — это про свободу".
Никогда не освобождаю память (и у меня все работает). Как? Неужели стоит написать статью об этом? #NothingIsFree
Если память не аллоцировать, то её не нужно освобождать! 😁
Когда я был неопытный и Питон ещё не изобрели, а консольные утилитки писать хотелось, то делал их на С и память не освобождал. Зачем? Процесс короткоживущий, данный не много грузит и операционка сама за процессом всё подчистит.
Можно было просто написать "хорошо делайте, а плохо не делайте".
Как распознать gpt-писанный текст:
Элементарные, я бы сказал, клишированные кейсы
Списки, списки, стены списков
Обезличенная подача
Вокруг да около, обо всем и ни о чем
Ставьте минус, гоните в шею
По поводу кто освобождает память, когда она возвращается из функции. Если это библиотечное выделение памяти, то тот кто создаёт, то же должен и предоставить метод для освобождения. А не просить используйте free(). Как редкий случай, в один прекрасный момент может поменяться способ аллокации.
Хорошая статья, я как раз изучию язык си
Типичные ошибки в Си: как их избежать и писать надёжный код