"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;
Получается, что использоваться будет нулевой указатель. Работа с нулевым указателем приведет к ошибке сегментации и возникновению исключения.
0