﻿# Access Violation

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

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

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

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

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

Рассмотрим дефект в коде программы на языке Си\+\+, который может привести к рассматриваемому типу ошибки\. Эта ошибка была найдена нашим анализатором [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) в проекте [Chromium](http://www.chromium.org/)\.

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

Данный код должен проверить значение указателя 'plugin\_instance' и если он не равен нулю, то вызвать функцию\. Ошибка заключается в том, что [приоритет оператора](https://pvs-studio.ru/ru/blog/terms/0064/) '\!' выше, чем оператора '&&'\. В результате, код работает не так, как ожидается\. Для ясности расставим скобки:

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

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

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

1. Wikipedia\. [Ошибка сегментации](https://ru.wikipedia.org/wiki/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0_%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D0%B8)\.
1. Александр Алексеев\. Access Violation в деталях\. [http://www\.gunsmoker\.ru/2009/05/access\-violation\.html](https://www.gunsmoker.ru/2009/05/access-violation.html)