Access Violation


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

Ошибка сегментации (англ. Segmentation fault или сокращённо segfault) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом.

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

В UNIX-подобных операционных системах процесс, обращающийся к недействительным участкам памяти, получает сигнал SIGSEGV. В Microsoft Windows, процесс, получающий доступ к недействительным участкам памяти, создаёт исключение STATUS_ACCESS_VIOLATION, и, как правило, запускает программу Dr. Watson, которая показывает пользователю окно с предложением отправить отчёт об ошибке Microsoft.

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

Рассмотрим дефект в коде программы на языке Си++, который может привести к рассматриваемому типу ошибки. Эта ошибка была найдена нашим анализатором PVS-Studio в проекте Chromium.

bool ChromeFrameNPAPI::Invoke(...)
{
  ChromeFrameNPAPI* plugin_instance =
    ChromeFrameInstanceFromNPObject(header);
  if (!plugin_instance &&
      (plugin_instance->automation_client_.get()))
    return false;
  ...  
}

Данный код должен проверить значение указателя 'plugin_instance' и если он не равен нулю, то вызвать функцию. Ошибка заключается в том, что приоритет оператора '!' выше, чем оператора '&&'. В результате, код работает не так, как ожидается. Для ясности расставим скобки:

if ( (!plugin_instance) && 
     (plugin_instance->automation_client_.get()))
  return false;

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

Библиографический список


Найденные ошибки

Проверено проектов
346
Собрано ошибок
13 124

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;