2011-01-17 2 views

ответ

3

Короче говоря: Нет

C не не выполняет никаких проверок во время выполнения, если вы не сделаете их вручную.

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

Вы также увидите влияние на производительность из-за дополнительных проверок условий. Возможно, вы сможете избежать некоторых из них, используя прямой доступ к ветвям кода, которые, как доказано, не приводят к обратным вызовам вне пределов.

EDIT:

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

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

1

Короткий ответ: Нет

Длинный ответ:
Чтобы обеспечить даже что-то так глупо, как buffer[ULLONG_MAX] не выходит за пределы, вы должны объявить буфер с присоединенным больше самого большого целого числа представимые в системе. Это, очевидно, невозможно, кроме объема памяти, который нужен такой буфер.

Практическое решение состоит в том, что вы вручную отслеживаете размер вашего буфера, а любая ненадежная индексация в буфер проверяется на размер буфера.

1

См. Наш Memory Safety Checker, который используется в качестве вспомогательного средства для отладки, и позволяет использовать ваш код C для определения ошибок в массивах или буферах. Это находит проблемы, которые не могут сделать valgrind.

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