2016-05-31 2 views
-1

В последние несколько лет я вижу множество рекомендованных на C++ лучших практик. Рекомендации C++ не применимы к C даже в меньшей степени. В частности, для людей, поступающих с языка относительно высокого уровня, такого как C++ или Java (например, я), программирование на C кажется очень опасным.Что такое современные идиомы C/руководящие принципы для предотвращения ошибок памяти?

Я знаю, что C слишком низкий уровень языка, чтобы делать какие-либо гарантии, но есть ли что-то, что я должен соблюдать при написании кода C, чтобы я мог свести к минимуму вероятность ошибок, связанных с памятью?

+1

Для тех, кто придет с языка * более низкого уровня, C является «легким и безопасным», поэтому он был разработан в первую очередь: чтобы инкапсулировать методы работы ассемблера. Но неинициализированные переменные, неинициализированные распределения памяти и превышение границ массива опасны. Компилятор может предупредить о первом, но другие - ваша ответственность. –

+0

... и если функция возвращает значение, которое не имеет непосредственного отношения, например 'scanf', или тот, который возвращает указатель, например' fopen', вы должны проверить это значение. Очень легко написать код, который игнорирует их, и падает при первом слое ветра. –

ответ

1

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

free(p); 
p = NULL; 

Это позволяет избежать оставляя p как оборванных указатель. Одним из очевидных преимуществ является то, что если вы снова назовете free на p, он ничего не сделает, поэтому вы можете избежать двойной бесплатной.

Второй способ заключается в использовании многочисленных инструментов, которые могут помочь вам отслеживать ошибки ubiqutous, такие как переполнение буфера, просто указывая Valgrind и AddressSanitizer.

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