Недопустимая операция указателя, как удалить в Word
Обновлено: 21.11.2024
Многие функции принимают указатели в качестве аргументов. Если функция разыменовывает недопустимый указатель (как в EXP34-C. Не разыменовывать нулевые указатели) или читает или записывает указатель, который не ссылается на объект, результаты не определены. Как правило, программа аварийно завершается при разыменовании недопустимого указателя, но возможно разыменование недопустимого указателя и изменение его памяти без аварийного завершения [Jack 2007]. Такие программы трудно отлаживать из-за сложности определения допустимости указателя.
Один из способов устранения недопустимых указателей — определить функцию, которая принимает аргумент указателя и указывает, является ли указатель допустимым для некоторого определения допустимого. Например, следующая функция объявляет действительным любой указатель, кроме NULL :
Некоторые платформы имеют средства проверки указателей для конкретных платформ.
Следующий код использует адрес _etext, определенный загрузчиком как первый адрес после текста программы на многих платформах, включая AIX, Linux, QNX, IRIX и Solaris. Он несовместим с POSIX и недоступен в Windows.
На платформе Linux эта программа выводит следующий результат:
Функция valid() не гарантирует достоверность; он идентифицирует только нулевые указатели и указатели на функции как недействительные. Однако его можно использовать для выявления значительного числа проблем, которые в противном случае могли бы остаться незамеченными.
Пример несовместимого кода
В этом примере несоответствующего кода функция incr() увеличивает значение, на которое ссылается ее аргумент. Он также гарантирует, что его аргумент не является нулевым указателем. Но указатель по-прежнему может быть недействительным, что приведет к повреждению памяти или аварийному завершению функции.
Соответствующее решение
Эту функцию incr() можно улучшить, используя функцию valid(). Получившаяся реализация с меньшей вероятностью разыменует недопустимый указатель или запишет в память, находящуюся за пределами допустимого объекта.
Функция valid() может зависеть от реализации и по возможности выполнять дополнительные проверки, зависящие от платформы. В худшем случае функция valid() может выполнять только ту же проверку нулевого указателя, что и пример несоответствующего кода. Однако на платформах, где возможна дополнительная проверка указателя, проверку может обеспечить использование функции valid().
Оценка рисков
Функция проверки указателя может использоваться для обнаружения и предотвращения выполнения операций над некоторыми недопустимыми указателями.
P3
L3
Автоматическое обнаружение
Связанные уязвимости
Ищите уязвимости, возникшие в результате нарушения этого правила, на веб-сайте CERT.
Сопутствующие рекомендации
CWE-20, Неправильная проверка входных данных
CWE-79, Неправильная нейтрализация входных данных во время создания веб-страницы ("Межсайтовый скриптинг")
CWE-89, Неправильная нейтрализация специальных элементов, используемых в Команда SQL («Внедрение SQL»)
CWE-91, Внедрение XML (также известное как слепое внедрение XPath)
CWE-94, Неправильный контроль генерации кода («Внедрение кода»)
CWE- 114, Управление процессом
CWE-601, Перенаправление URL на ненадежный сайт ("Открытое перенаправление")
Библиография
10 Комментариев
Питер Гутманн
Использование _etext несколько ненадежно в разных системах. Например, в системе x86-64 FreeBSD из общей библиотеки, которую я сейчас получаю:
p = 0xB34110, &_etext = 0x7F9B0C495246, &_edata = 0x7F9B0C7183A0, &_end = 0x7F9B0C718EE8.
В этом случае p находится в стеке, а не в переменной malloc. У меня также были сообщения о сбое на встроенном устройстве PPC Linux. Предположительно это связано с тем, что один общий образ может быть отображен практически в любом месте адресного пространства каждого процесса, и, кроме того, может быть несколько _etext для разных общих библиотек. Возможно, кто-то, кто знает больше о том, как разные операционные системы размещают данные в памяти, мог бы прокомментировать это и при каких условиях безопасно использовать _etext.
Питер Гутманн
Еще несколько комментариев по поводу _etext. Я думаю, что в целом это слишком ненадежно, чтобы безопасно использовать его в коде, если только у вас нет полного контроля над средой, в которой он развернут.Он не работает с разделяемыми библиотеками, он не работает с SELinux (это то, что вы ожидаете увидеть в сочетании с кодом, который был тщательно написан для таких вещей, как проверка указателей), и я понятия не имею, что он будет делать. делать в сочетании с различными подходами к ASLR, но я подозреваю, что это не сработает и с некоторыми из них. Возможно, если бы вы могли обернуть проверку _etext в какую-то libmemcheck, которая запускает самопроверку при запуске и превращает сравнение в неактивное, если на проверку _etext нельзя положиться, это было бы безопасно, но без этого это слишком рискованно включать в любой кросс-платформенный или гетерогенный код среды. Я (неохотно) отключил его в своем коде, я получал слишком много отчетов об ошибках. возможно, было бы неплохо предупредить в тексте выше о его высоком уровне непереносимости, что даже в той же системе он может сломаться в зависимости от того, включено ли что-то вроде SELinux или нет.
Роберт Сикорд
Возможно, я просто устал и ворчун, но первое совместимое решение (проверка) делает то же самое, что и несовместимый пример (в тех случаях, когда функция validate() проверяет только нулевые указатели), и делает значительно меньше во втором совместимом решении (утверждение), поскольку assert() предположительно будет исключен в сборке без отладки.
Питер Гутманн
Питер Гутманн
Сейчас выглядит хорошо, спасибо!
Джим Гимпел
Я полагаю, что у поставщика компилятора/библиотеки будет гораздо лучшее представление о том, как написать функцию valid(). Я бы надеялся, что он будет встроенным. Есть 3 вида действительных (по крайней мере). Существует действительный указатель на функцию, действительный указатель на данные и указатель, который можно передать в free.
Питер Гутманн
Единственный поставщик, которого я знаю, который когда-либо делал это, — это Microsoft с их проверками IsBadXXXPtr(), которые использовали зондирование памяти и исключения первого шанса для обнаружения недопустимых указателей. Это работало очень хорошо, но имело некоторые неприятные побочные эффекты, которые означали, что они превратили их в бесполезные, начиная с Vista. Таким образом, на самом деле нет никакого способа сделать это, благословленного поставщиком, поэтому здесь есть все предложения по методам проверки для конкретной платформы и ситуации.
Дополнительные сведения о проблемах с IsBadXXXPtr() см. в комментариях Раймонда Чена. Однако, используя эти функции в течение многих лет, я знаю, что они обнаруживают огромное количество пользовательских ошибок, особенно при вызове из языка, отличного от C, когда программист не совсем правильно понимает соглашение о доступе к памяти, и я не знаю из них вызывают какие-либо проблемы.
Еще один вариант для систем Unix, и это всего лишь псевдокод, выглядит примерно так:
(при условии, что ОС не выполняет ускоренную проверку особых случаев FD, чего делать не следует). Если бы я использовал что-то подобное в программе, я бы сделал это под вымышленным именем.
Ананд Тивари
для указателя структуры/объекта мы можем сделать немного больше в valid(), например, проверить магическое поле в структуре, которое может быть установлено при выделении объекта и может быть установлено что-то другое при освобождении объекта. Это предоставит нам, является ли это допустимым указателем объекта или уже освобожденным указателем объекта или поврежденным указателем.
Давид Свобода
Это обычно называют "канарейкой", и часто это хорошее частичное решение. Канарейки могут быть подделаны обычным повреждением (редко) или злоумышленниками (чаще!).
Ёдзо ТОДА
о ревизии 58: кто-то, читая японскую версию, указал, что "*intptr++" означает "*(intptr++)". Я подтвердил с помощью справочника по языку (черновик C17), что оператор «++» имеет более высокий приоритет, чем «*», и небольшая тестовая программа. Здорово.
Обсудите и поддержите Недопустимую операцию указателя при запуске программы в программном обеспечении и приложениях Windows 10 для решения проблемы; Привет. У меня есть программа, которая прекрасно устанавливается на другой компьютер W10 Pro, x64 (1809), но когда я запускаю ее в своей учетной записи, вот что я вижу: [img]. Compumind, 11 февраля 2019 года. Обсуждение в разделе "Программное обеспечение и приложения для Windows 10".
Недопустимая операция указателя при запуске программы
Недопустимая операция указателя при запуске программы – Похожие темы – Недопустимая операция указателя
Недопустимая операция с плавающей запятой при установке программ Windows 10
Недопустимая операция с плавающей запятой при установке программ Windows 10: у меня внезапно появляется эта ошибка при попытке установить программы или даже открыть их. Некоторые программы также начали мгновенно падать, прежде чем открываться. Другие программы работают нормально. Однако это согласуется с тем, какие из них работают, а какие нет. Я бегал.
Недопустимая операция с плавающей запятой при установке программ Windows 10
Недопустимая операция с плавающей запятой при установке программ Windows 10: у меня внезапно появляется эта ошибка при попытке установить программы или даже открыть их. Некоторые программы также начали мгновенно падать, прежде чем открываться. Другие программы работают нормально.Однако это согласуется с тем, какие из них работают, а какие нет. Я бегал.
Недопустимая операция с плавающей запятой при установке программ Windows 10
Недопустимая операция с плавающей запятой при установке программ Windows 10: у меня внезапно появляется эта ошибка при попытке установить программы или даже открыть их. Некоторые программы также начали мгновенно падать, прежде чем открываться. Другие программы работают нормально. Однако это согласуется с тем, какие из них работают, а какие нет. Я бегал.
Ошибка OpenGL 1282 Недопустимая операция!
Ошибка OpenGL 1282 Недопустимая операция!: Итак, я думаю, что это четвертый вопрос, который я задал Microsoft. У меня было много проблем с компьютером. Теперь у меня есть новый, поэтому у меня меньше проблем, но сегодня я наткнулся на ошибку, и она связана с OpenGL. Поэтому я скачал пакет шейдеров для Minecraft и активировал его.
Синий экран "Недопустимая операция WFP"
Синий экран «Недопустимая операция WFP»: Здравствуйте, у меня уже некоторое время возникают проблемы с моим ноутбуком. Моя модель — Acer Aspire VN7-791G-79QW. Я уже связался со службой поддержки Acer, и мне сказали перейти на Windows 8.1 и удалить антивирус. Тем не менее, у меня была Win 10 около 2 лет.
Onedrive: операция в облаке недействительна
Синий экран недопустимой операции WFP
Синий экран неправильной операции WFP: Здравствуйте, у меня уже некоторое время возникают проблемы с моим ноутбуком. Моя модель — Acer Aspire VN7-791G-79QW. Я уже связался со службой поддержки Acer, и мне сказали перейти на Windows 8.1 и удалить антивирус. Тем не менее, у меня была Win 10 около 2 лет.
Недопустимая операция WFP
Неверная операция WFP: Привет, я продолжаю получать этот синий экран сначала в режиме ожидания, когда я начинаю играть в игру LoL и, наконец, когда я пытаюсь обновить драйверы. Недавно я переформатировал свой ноутбук, потому что раньше мой драйвер Wi-Fi вел себя очень странно, он отключался сам по себе.
недопустимая операция wfp
недействительная операция wfp: Здравствуйте, при любом движении ноутбука восходит синий экран с надписью ВПП НЕДОПУСТИМАЯ ОПЕРАЦИЯ, уже несколько раз пробовала с YouTube все обновил и драйвера Все равно какое-то НЕ изменилось ноутбук Acer Aspire es1- 523 Процессор AMD E1-7010 APU с графикой AMD.
> Я использую Delphi 1 (у нас все еще есть много пользователей Win 3.x), и я
> получаю очень раздражающие ошибки "Недопустимая операция указателя".> В моем коде не используются pchars и нет другого явного использования указателей
>.
Я боролся с Invalid Pointer Operation около месяца. Они
не веселые! Обычно вы обращаетесь к уже освобожденному объекту. Я
проделал следующий глупый трюк:
процедура MyObject.Free;
begin
// FreeNow — это закрытое поле MyObject.
если FreeNow, то начать
унаследовано Free;
конец;
конец;
процедура MyObject.Release;
начать
FreeNow := True;
Бесплатно;
FreeNow := False;
конец;
Последняя строка в Релизе действительно . Я все еще "внутри" своего объекта, но
объекта больше нет, так что доступ к себе очень плох. Это _будет_ причиной
недопустимого указателя. когда-то. Это подсказка. Куча была перепутана
и программа в какой-то, неизвестный, более поздний момент взорвется.
Цитата
мартин.ларс. @delfidata.no.NOSPAM (Мартин Ларссон) пишет:
>Я боролся с операцией с недопустимым указателем около месяца. Они не
>веселые! Обычно вы обращаетесь к уже освобожденному объекту. Я
>проделал следующий глупый трюк:
Вы всегда устанавливаете указатель освобожденного объекта на ноль после его освобождения?
а затем проверить ("if Assigned(MyObject)") перед использованием или попыткой освободить его?
Цитата
>Вы всегда устанавливаете указатель освобожденного объекта на ноль после того, как вы его освободили.
>а затем проверьте ("if Assigned(MyObject)") перед использованием или попыткой освободить его?
Спасибо за ответ. В моем коде указатели не используются явным образом,
не создаются и не уничтожаются какие-либо объекты явным образом. Я знаю, что Delphi
делает всевозможные вещи под капотом, но я ничего (явно) не освобождаю и
не уничтожаю, потому что мой код ничего (явно) не создает
( кроме операторов создания, автоматически вводимых при использовании
IDE.)
Вот почему я в тупике.
--
Гэри Джонс (Удалить SSPPAAMMBLOCK из адреса электронной почты)
Открытые ключи PGP доступны с серверов
Идентификатор ключа RSA: 0x6AFBEAA1
Идентификатор ключа DSS/Diffie-Hellman : 0x11EAE903
Цитата
Цитата
>Спасибо за ответ. В моем коде указатели не используются явным образом и
>не создаются и не уничтожаются какие-либо объекты явным образом.Я знаю, что Delphi делает все
>под капотом, но я ничего (явно) не освобождаю и
> не уничтожаю, потому что мой код ничего (явно) не создает
>(кроме операторов создания, автоматически вводимых при использовании
>IDE.)>Вот почему я в тупике.
Вы можете столкнуться с такими проблемами, просто ссылаясь на указатели,
особенно когда вы используете какой-либо список. Имейте в виду, что экземпляры
компонентов и даже некоторые свойства на самом деле являются указателями, даже если
знак ^ удален. Так, например, манипулирование блокнотом потребует
небольшой обработки указателя, даже если он находится "под капотом", как
вы говорите. Компонент ноутбука представляет собой список указателей и, например. отсутствие
небольшой части диапазона приведет к некоторым довольно недопустимым
операциям с указателями.
Что я пытаюсь сказать (и как пытался сказать Мартин), вы используете
указатели все время, даже если вы не делаете это явно, как вы говорите,
и когда вы используете некоторые виды списков (например, сетки, записные книжки,
списки и т. д.) почти любая ошибка приведет к проблемам с указателем.
Цитата
> Вы всегда устанавливаете указатель освобожденного объекта на ноль после того, как освободили его.
> и затем проверьте ("if Assigned(MyObject)") перед использованием или попыткой освободить его?
Я установил их на ноль, но нет смысла проверять Назначено. Бесплатный
гарантированно работает с нулевыми объектами.
С другой стороны. Это не имеет значения. Как только вы станете общим владельцем
объекта, вы можете оказаться в исключении из-за недопустимой операции с указателем.
Если вы боретесь со ссылкой на код остановки Windows 10 из-за ошибки указателя, вы можете не беспокоиться. Вы можете выполнить несколько простых шагов, чтобы устранить проблему.
Дэвид Дарлингтон
11 марта 2022 г. • Подано в: Windows Computer Solutions • Проверенные решения
При запуске компьютера вы можете увидеть сообщение о том, что "обнаружена проблема, и Windows была закрыта, чтобы предотвратить повреждение вашего компьютера".
REFERENCE_BY_ POINTER."
Это ошибка типа "синий экран смерти", из-за которой вам будет сложно работать с системой. Это сообщение указывает на то, что счетчик ссылок элемента является недопустимым для его текущего состояния.
Эта ошибка BSOD может возникать по разным причинам, в том числе из-за поврежденных графических драйверов, поврежденных системных файлов, вредоносных программ и несовместимого оборудования. Однако вы можете потерять несохраненные данные из-за кода остановки «Ссылка по указателю». Но это уже не сложно восстановить. С помощью приложения Recoverit вы сможете восстановить утерянные данные, и эта статья поможет вам в этом.
7 решений для исправления этой ошибки в Windows7/8/10/11
Ссылка на код остановки по указателю — распространенная проблема в Windows 7/8/10/11. Если вы видите это сообщение на экране вашего компьютера в первый раз, вы можете перезагрузить компьютер. Этот процесс обычно устраняет проблему.
Если эта проблема сохраняется, это означает, что вам необходимо найти и избавиться от несовместимого объекта. В этом случае вы можете выполнить шаги, указанные ниже.
Решение 1. Обновление старых или поврежденных графических драйверов
Старые, отсутствующие или поврежденные графические драйверы могут вызвать множество проблем на вашем компьютере. Ссылка по коду остановки указателя является одним из них. Обновите устаревшие графические драйверы, выполнив простые действия.
Шаг 1. Вы можете нажать «Клавиша Windows + R» и открыть утилиту «Выполнить». Теперь напишите команду «devmgmt.msc» и нажмите кнопку «Ввод».
Шаг 2. Откроется вкладка "Диспетчер устройств". Здесь вы можете найти «Видеоадаптеры».
Шаг 3. Щелкните правой кнопкой мыши старый или поврежденный драйвер дисплея. Теперь нажмите «Обновить программное обеспечение драйвера».
Шаг 4. Вы можете нажать кнопку "Автоматический поиск обновленного программного обеспечения драйвера".
Шаг 5. Подождите, пока завершится процесс установки или обновления. После этого перезагрузите компьютер. Убедитесь, что проблема решена.
Решение 2. Запуск утилиты проверки системных файлов
Отсутствующие, поврежденные и поврежденные системные файлы могут нанести вред вашему компьютеру. Это вызвано изменениями в реестре Windows, установкой стороннего программного обеспечения и так далее. После этого это может привести к распространенным ошибкам BSOD, таким как ссылка на код остановки Windows по ошибке указателя. Проверьте системные файлы с помощью SFC. Для этого выполните указанные шаги.
Шаг 1. Нажмите одновременно «Клавиша Windows+S» и введите команду «cmd». Затем нажмите кнопку «Ввод». Теперь вы можете щелкнуть правой кнопкой мыши «Командная строка» и выбрать «Запуск от имени администратора».
Шаг 2. Введите команду «sfc /scannow» и нажмите «Ввод».
Шаг 3. Запустится проверка системных файлов. Он найдет и восстановит любые поврежденные или поврежденные файлы.
После завершения этого процесса перезагрузите компьютер и проверьте, решена ли проблема.
Решение 3. Удалите проблемное ПО
Проблемное и несовместимое программное обеспечение также может вызывать ошибку остановки BSOD. Чтобы избавиться от них, выполните указанные шаги.
Шаг 1. Нажмите «Windows Key + R», чтобы открыть программу запуска, и напишите «msconfig». Затем нажмите "Ввод".
Шаг 2. На экране компьютера откроется вкладка «Конфигурация системы». В разделе "Выборочный запуск" вы можете снять флажок "Загружать элементы автозагрузки".
Шаг 3. Теперь откройте вкладку "Службы" и установите флажок "Скрыть все службы Microsoft". Затем нажмите «Отключить все».
Шаг 4. Теперь вы можете перейти на вкладку "Автозагрузка" и нажать кнопку "Открыть диспетчер задач".
Шаг 5. Щелкните объекты правой кнопкой мыши и выберите параметр "Отключить".
Шаг 6. Вернитесь в окно "Конфигурация системы" и соответственно выберите "Применить" и "ОК".
Шаг 7. Перезагрузите компьютер и проверьте, решена ли проблема. Если проблемы нет, это означает, что проблема связана с программным обеспечением. Найдите программное обеспечение и удалите его.
Решение 4. Проверьте антивирус
Ссылка на код остановки с помощью указателя также может произойти, когда ваш антивирус мешает работе вашего компьютера. Чтобы проверить это, сначала отключите антивирус. Проверьте, решена ли проблема.
Однако, если стоп-ошибка сохраняется, вы можете удалить антивирусное программное обеспечение. Используйте специальный деинсталлятор для выполнения задачи. После удаления антивирусного программного обеспечения проверьте, решена ли проблема.
Если вы видите, что удаление программного обеспечения решило проблему, замените программное обеспечение в дальнейшем. Кроме того, если на вашем компьютере установлено стороннее антивирусное программное обеспечение, удалите его. И проверьте, решает ли это проблему.
Решение 5. Запустите команду DISM
В некоторых случаях при обновлении компьютера до Windows 10 может возникнуть стоп-ошибка. Это указывает на то, что файлы образа Windows повреждены. Это может произойти в процессе обновления. В этом случае SFC работать не будет. Вы должны запустить команду DISM.
Шаг 1. Откройте «Командную строку» в утилите «Выполнить» и выберите «Запуск от имени администратора».
Шаг 2. Напишите команду "DISM.exe /Online /Cleanup-image /Restorehealth" и нажмите кнопку "Ввод".
Шаг 3. Это обнаружит проблемные файлы образов Windows и восстановит их. После завершения процесса перезагрузите компьютер и проверьте, решена ли проблема.
Решение 6. Проверьте, не перегревается ли ваш компьютер
Многие пользователи сообщают, что перегрев ПК является еще одной причиной для ссылки на ошибку кода остановки указателя. Если температура вашего процессора повысится, это может привести к сбою компьютера. Проверяйте температуру каждый раз, когда ваш компьютер сталкивается с проблемой.
Очистите ЦП от пыли. Это может помочь вам решить эту проблему. Проблемы с перегревом компьютера также можно уменьшить с помощью программы контроля температуры процессора.
Решение 7. Проверьте свое оборудование
Несовместимое оборудование также может быть причиной появления этой ошибки "Синий экран смерти". Если вы установили новое оборудование, а затем заметили эту проблему, это означает, что оборудование несовместимо. В этом случае удалите или замените оборудование. После этого перезагрузите компьютер и проверьте, решена ли проблема.
Как восстановить несохраненные или потерянные данные из-за остановки ссылки на код по указателю?
Потеря данных в наши дни — редкое явление. С помощью приложения Recoverit вы можете восстановить любые данные, которые вы потеряли. Если вы потеряли свои несохраненные данные из-за ссылки Стоп-кода по указателю Windows 10, Recoverit поможет вам в этом.
Инструмент может восстанавливать более 812 типов файлов. Сюда входят NTFS, FAT, APFS, HFS+ и так далее. Кроме того, это ничего не меняет в потерянных данных.
Recoverit — это высокотехнологичный инструмент для извлечения данных, который может восстановить ваши данные с любого устройства хранения. Требуется всего несколько простых шагов, чтобы восстановить все данные, которые вы потеряли. Для этого следуйте данной инструкции.
Шаг 1. Выберите местоположение:
- Откройте приложение Recoverit и перейдите на вкладку "Жесткие диски и их расположение".
- Теперь вам нужно выбрать жесткий диск на этой вкладке или выбрать "Рабочий стол". Затем нажмите кнопку «Пуск», и начнется сканирование.
Шаг 2. Сканирование местоположения:
- На этом шаге Recoverit сканирует файлы. А пока вы можете выбрать и указать файлы.
- Чтобы определить файлы, необходимо выбрать соответственно «Путь к файлу» и «Тип файла». Вы также можете использовать «Фильтр поиска», если вам это нужно.
- Если вы нашли нужный файл во время сканирования, вы можете приостановить и остановить процесс. Для этого нужно нажать кнопку "Пауза", а затем кнопку "Стоп".
Шаг 3. Предварительный просмотр и восстановление файлов:
- Для предварительного просмотра файла сначала нажмите на него. После этого справа появится миниатюра. Вы должны нажать на опцию «Предварительный просмотр» и просмотреть файл.
- Вы можете просматривать различные типы файлов, например фотографии, аудио-, видеофайлы, файлы PowerPoint, файлы Word, файлы Excel, файлы Pdf и т. д.
- Теперь подтвердите файлы, чтобы восстановить его. Вы можете нажать кнопку «Восстановить» и выбрать путь (кроме пути, по которому вы потеряли данные), чтобы сохранить файлы.
Итог
Ссылка по коду остановки указателя может раздражать. Избавьтесь от проблемы, следуя инструкции. А если вы потеряли данные, Recoverit поможет вам. Это высоко оцененное и надежное программное обеспечение. Если вам нужно восстановить какие-либо данные, посетите веб-сайт Wondershare и загрузите приложение.
Читайте также: