Что такое код strerror


Содержание

Что такое код strerror

socket_strerror — возвращает строку — описание ошибки сокета.

Описание

string socket_strerror (int errno)

Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

Пример 1. socket_strerror()

echo «socket_bind() failed: reason: » . socket_strerror(socket_last_error($socket)) . «\n»; > ?>

socket_bind() failed: reason: Permission denied

Это правильный способ использования strerror_r?

я обеспечиваю C++ обертки к потокобезопасной strerror_r в коде следующим образом:

Это только простой упаковщик так в коде C++ я могу сказать что-то вроде

и использования потокобезопасная печать errno. Также кажется, что можно использовать 128, потому что справочная страница говорит, что strerror_r либо вернет указатель на неизменяемую статическую строку (предположительно завершенную нуль), либо указатель на buf после заполнения его нулевым терминатором независимо от размера . просто не уверен, что с этой простой оболочкой что-то не так.

Создан 21 фев. 13 2013-02-21 17:06:14 Palace Chan

ли у Вас конкретная проблема с этим кодом? – Dark Falcon 21 фев. 13 2013-02-21 17:28:31

1 ответ

Я не понимаю полный контекст, в котором вы хотите его использовать (в частности, какова роль структуры MyErrno и что такое StreamErrno , поскольку ваше определение operator относится к значению типа sockaddr_in , которое не используется).

Однако, в общих чертах, это не безопасный способ использования errno , хотя это совершенно безопасный способ использования strerror_r .

Проблема заключается в том, что вы в основном, вероятно, использовать это в контексте, как это:

То есть, вероятно, будет какой-то системный вызов (выводит строку «что-то плохое случилось») между системой вызов которого не удался, оставив значение в errno и использование errno в вашей функции. Довольно хорошо, что любой системный вызов может привести к установке errno , даже если ошибка безобидна; следовательно, наилучшей практикой является получение значения errno немедленно. Это будет хорошая причина для использования пользовательского типа, как MyError :

Создан 21 фев. 13 2013-02-21 18:23:31 rici

Почему я не могу использовать strerror?

Я переношу некоторый код в Windows, а компилятор Microsoft (Visual С++ 8) сообщает мне, что strerror() является небезопасным.

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

Есть ли хорошая альтернатива в C?

Есть ли хорошая альтернатива в С++?

Имея некоторые хорошие ответы и теперь понимая, что некоторые реализации могут быть настолько сумасшедшими, чтобы на самом деле писать общий общий буфер — небезопасно для повторного размещения в одном потоке, неважно между потоками! — мой вопрос перестает быть «Почему я не могу использовать его, и каковы альтернативы?» на «Есть ли приличные, сжатые альтернативы в C и/или С++?»

6 ответов

strerror устарел, поскольку он не является потокобезопасным. strerror работает во внутреннем статическом буфере, который может быть перезаписан другими параллельными потоками. Вы должны использовать безопасный вариант под названием strerror_s .

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

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

Чтобы устранить это, появился новый интерфейс с той же функциональностью:

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

ПРИМЕЧАНИЕ: вышеупомянутый прототип представляет собой спецификацию XSI. Он может различаться для каждой платформы или с параметрами компилятора или символами #define . GNU, например, делает эту версию или ее собственную версию доступной в зависимости от #define

Почему я не могу использовать strerror?

Я портирую некоторый код на Windows, и компилятор Microsoft (Visual C ++ 8) сообщает мне, что strerror() небезопасен.

Отбросив фактор раздражения во всех безопасных строковых вещах от Microsoft, я на самом деле вижу, что некоторые устаревшие функции опасны. Но я не могу понять, что может быть не так с strerror() . Он принимает код ( int ) и возвращает соответствующую строку или пустую строку, если этот код неизвестен.

Есть ли хорошая альтернатива в C?

Есть ли хорошая альтернатива в C ++?

Имея несколько хороших ответов и теперь понимая, что некоторые реализации могут быть достаточно сумасшедшими, чтобы фактически записывать в общий разделяемый буфер — небезопасно входить в один поток, не говоря уже о потоках! — мой вопрос перестает звучать так: «Почему я не могу его использовать, и каковы альтернативы? Есть ли приличные, лаконичные альтернативы в C и / или C ++? «

7 ответов

strerror устарел, потому что он не является потокобезопасным. strerror работает с внутренним статическим буфером, который может быть перезаписан другими параллельными потоками. Вы должны использовать безопасный вариант с именем strerror_s .

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

strerror само по себе не небезопасно. В старые времена, прежде чем нарезать нить, это просто не было проблемой. С потоками два или более потоков могли бы вызвать strerror , оставляя возвращенный буфер в неопределенном состоянии. Для однопоточных программ не помешает использовать strerror , если они не играют в какие-то странные игры в libc, например, общую память для всех приложений в DLL.

Для решения этой проблемы есть новый интерфейс с той же функциональностью:

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

ПРИМЕЧАНИЕ: приведенный выше прототип является спецификацией XSI. Это может варьироваться в зависимости от платформы или с параметрами компилятора или #define символов. GNU, например, делает эту или свою собственную версию доступной в зависимости от #define

Имея несколько хороших ответов и теперь понимая, что некоторые реализации могут быть достаточно сумасшедшими, чтобы фактически записывать в общий разделяемый буфер — небезопасно входить в один поток, не говоря уже о потоках! — мой вопрос перестает звучать так: «Почему я не могу его использовать, и каковы альтернативы? Есть ли приличные, лаконичные альтернативы в C и / или C ++? «

Posix указывает strerror_r() , а в Windows вы можете использовать strerror_s() , который немного отличается, но имеет ту же цель. Я делаю это:

Я написал эту функцию, потому что функции потоков Posix не изменяют errno , вместо этого они возвращают код ошибки. Таким образом, эта функция в основном такая же, как perror() , за исключением того, что она позволяет вам предоставить код ошибки, отличный от errno , а также отображает некоторую информацию об отладке. Вы можете адаптировать его к вашим потребностям.

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

Представьте себе это:

В зависимости от реализации strerror() этот код выводит код ошибки для кода ошибки 2, а не для кода ошибки 1.

Для краткой обертки можно использовать STLSoft , stlsoft::error_desc , например:

Глядя на код, кажется, что он реализован в терминах strerror() , что означает, что он будет безопасен для повторного входа в поток (т.е. е. если используется несколько раз в данном выражении), но это не решает проблему многопоточности.

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

Хотя я не знаю причин Microsoft, я отмечаю, что strerror возвращает неконстантный символ *, что означает, что существует риск, что какой-то Merry Prankster вызвал strerror до того, как вы сделали и изменили сообщение.

Я понимаю другой ответ, но я думаю, что показ кода более понятен.

проверить реализацию glibc (мы должны получить похожий код в MS lib)

Когда errnum не является известной ошибкой, необходимо сгенерировать строку типа «Неизвестная ошибка 41». Эта строка НЕ ​​является константой, но генерируется в выделенном буфере. И buf является глобальным вар. поэтому его содержание может измениться при повторном вызове strerror . Вот почему это небезопасно.

С другой стороны, strerror_r(int errnum, char *buf, size_t buflen) , он генерирует строку ошибки для аргумента buf . так что сейчас нет глобального ресурса. Вот почему это потокобезопасно.

Что такое STRERROR.EXE? Это безопасно или вирус? Как удалить или исправить это

Что такое STRERROR.EXE?

STRERROR.EXE это исполняемый файл, который является частью Приложения, платформы, серверы разработанный Microsoft, Версия программного обеспечения для Windows: 1.0.0.0 обычно 43008 в байтах, но у вас может отличаться версия.

Расширение .exe имени файла отображает исполняемый файл. В некоторых случаях исполняемые файлы могут повредить ваш компьютер. Пожалуйста, прочитайте следующее, чтобы решить для себя, является ли STRERROR.EXE Файл на вашем компьютере — это вирус или вредоносная программа, которую вы должны удалить, или, если это действительно допустимый файл операционной системы Windows или надежное приложение.

STRERROR.EXE безопасный, или это вирус или вредоносная программа?

Первое, что поможет вам определить, является ли тот или иной файл законным процессом Windows или вирусом, это местоположение самого исполняемого файла. Например, для STRERROR.EXE его путь будет примерно таким: C: \ Program Files \ Microsoft \ Applications, Platforms, Servers \ STRERROR.EXE

Чтобы определить его путь, откройте диспетчер задач, перейдите в «Просмотр» -> «Выбрать столбцы» и выберите «Имя пути к изображению», чтобы добавить столбец местоположения в диспетчер задач. Если вы найдете здесь подозрительный каталог, возможно, будет хорошей идеей продолжить изучение этого процесса.

Другой инструмент, который иногда может помочь вам обнаружить плохие процессы, — это Microsoft Process Explorer. Запустите программу (она не требует установки) и активируйте «Проверить легенды» в разделе «Параметры». Теперь перейдите в View -> Select Columns и добавьте «Verified Signer» в качестве одного из столбцов.

Если статус процесса «Подтвержденный подписчик» указан как «Невозможно проверить», вам следует взглянуть на процесс. Не все хорошие процессы Windows имеют ярлык проверенной подписи, но ни один из них не имеет плохих.

Наиболее важные факты о STRERROR.EXE:

  • Имя: STRERROR.EXE
  • Программного обеспечения: Приложения, платформы, серверы
  • Издатель: Microsoft
  • Ожидаемое местоположение: C: \ Program Files \ Microsoft \ Приложения, платформы, серверы \ подпапке
  • Ожидаемый полный путь: C: \ Program Files \ Microsoft \ Приложения, платформы, серверы \ STRERROR.EXE
  • SHA1: C59AEFF84F3EE5973F5052231D3BEB251FE1C23F
  • SHA256:
  • MD5: 2290B8007D6D141604012F1E1A87F568
  • Известно, что до 43008 размер байт в большинстве Windows;

Если у вас возникли какие-либо трудности с этим исполняемым файлом, вы должны определить, заслуживает ли он доверия, прежде чем удалять STRERROR.EXE. Для этого найдите этот процесс в диспетчере задач.

Найти его местоположение и сравнить размер и т. Д. С приведенными выше фактами

Если вы подозреваете, что можете быть заражены вирусом, вы должны немедленно попытаться это исправить. Чтобы удалить вирус STRERROR.EXE, необходимо скачайте и установите приложение полной безопасности, как это, Обратите внимание, что не все инструменты могут обнаружить все типы вредоносных программ, поэтому вам может потребоваться попробовать несколько вариантов, прежде чем вы добьетесь успеха.

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

Могу ли я удалить или удалить STRERROR.EXE?

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

Лучшая диагностика для этих подозрительных файлов — полный системный анализ с ASR Pro or это антивирус и средство для удаления вредоносных программ, Если файл классифицируется как вредоносный, эти приложения также удаляют STRERROR.EXE и избавляются от связанных вредоносных программ.

Однако, если это не вирус и вам нужно удалить STRERROR.EXE, вы можете удалить Приложения, Платформы, Серверы с вашего компьютера, используя его деинсталлятор. Если вы не можете найти его деинсталлятор, то вам может понадобиться удалить Приложения, Платформы, Серверы, чтобы полностью удалить STRERROR.EXE. Вы можете использовать функцию «Установка и удаление программ» на панели управления Windows.

  • 1. в Меню Пуск (для Windows 8 щелкните правой кнопкой мыши в нижнем левом углу экрана), нажмите Панель управления, а затем под программы:
    o Windows Vista / 7 / 8.1 / 10: нажмите Удаление программы.
    o Windows XP: нажмите Добавить или удалить программы.
  • 2. Когда вы найдете программу Приложения, платформы, серверыщелкните по нему, а затем:
    o Windows Vista / 7 / 8.1 / 10: нажмите Удалить.
    o Windows XP: нажмите Удалить or Изменить / Удалить вкладка (справа от программы).
  • 3. Следуйте инструкциям по удалению Приложения, платформы, серверы.

Распространенные сообщения об ошибках в STRERROR.EXE

Наиболее распространенные ошибки STRERROR.EXE, которые могут возникнуть:

• «Ошибка приложения STRERROR.EXE.»
• «STRERROR.EXE не удалось.»
• «Возникла ошибка в приложении STRERROR.EXE. Приложение будет закрыто. Приносим извинения за неудобства.»
• «STRERROR.EXE не является допустимым приложением Win32».
• «STRERROR.EXE не запущен».
• «STRERROR.EXE не найден.»
• «Не удается найти STRERROR.EXE.»
• «Ошибка запуска программы: STRERROR.EXE.»
• «Неверный путь к приложению: STRERROR.EXE.»

Эти сообщения об ошибках .exe могут появляться во время установки программы, во время выполнения связанной с ней программы, приложений, платформ, серверов, во время запуска или завершения работы Windows или даже во время установки операционной системы Windows. Отслеживание момента появления ошибки STRERROR.EXE является важной информацией, когда дело доходит до устранения неполадок.

Как исправить STRERROR.EXE

Аккуратный и опрятный компьютер — это один из лучших способов избежать проблем с STRERROR.EXE. Это означает выполнение сканирования на наличие вредоносных программ, очистку жесткого диска cleanmgr ПФС / SCANNOWудаление ненужных программ, мониторинг любых автозапускаемых программ (с помощью msconfig) и включение автоматических обновлений Windows. Не забывайте всегда делать регулярные резервные копии или хотя бы определять точки восстановления.

Если у вас возникла более серьезная проблема, постарайтесь запомнить последнее, что вы сделали, или последнее, что вы установили перед проблемой. Использовать resmon Команда для определения процессов, вызывающих вашу проблему. Даже в случае серьезных проблем вместо переустановки Windows вы должны попытаться восстановить вашу установку или, в случае Windows 8, выполнив команду DISM.exe / Online / Очистка-изображение / Восстановить здоровье, Это позволяет восстановить операционную систему без потери данных.

Чтобы помочь вам проанализировать процесс STRERROR.EXE на вашем компьютере, вы можете найти следующие программы полезными: Менеджер задач безопасности отображает все запущенные задачи Windows, включая встроенные скрытые процессы, такие как мониторинг клавиатуры и браузера или записи автозапуска. Единый рейтинг риска безопасности указывает на вероятность того, что это шпионское ПО, вредоносное ПО или потенциальный троянский конь. Это антивирус обнаруживает и удаляет со своего жесткого диска шпионское и рекламное ПО, трояны, кейлоггеры, вредоносное ПО и трекеры.

Обновленный ноябрь 2020:

Мы рекомендуем вам попробовать этот новый инструмент. Он исправляет множество компьютерных ошибок, а также защищает от таких вещей, как потеря файлов, вредоносное ПО, сбои оборудования и оптимизирует ваш компьютер для максимальной производительности. Это исправило наш компьютер быстрее, чем делать это вручную:

  • Шаг 1: Скачать PC Repair & Optimizer Tool (Windows 10, 8, 7, XP, Vista — Microsoft Gold Certified).
  • Шаг 2: Нажмите «Начать сканирование”, Чтобы найти проблемы реестра Windows, которые могут вызывать проблемы с ПК.
  • Шаг 3: Нажмите «Починить все», Чтобы исправить все проблемы.

Загрузите или переустановите STRERROR.EXE

это не рекомендуется загружать заменяемые exe-файлы с любых сайтов загрузки, так как они могут содержать вирусы и т. д. Если вам нужно скачать или переустановить STRERROR.EXE, то мы рекомендуем переустановить основное приложение, связанное с ним. Приложения, платформы, серверы.

Что такое приложения, платформы, серверы

Сервер приложений — это программная структура, которая предоставляет как средства для создания веб-приложений, так и серверную среду для их запуска. Сервер приложений выступает в качестве набора компонентов, доступных разработчику программного обеспечения через стандартный API, определенный для самой платформы.

Информация об операционной системе

Ошибки STRERROR.EXE могут появляться в любых из нижеперечисленных операционных систем Microsoft Windows:

  • Окна 10
  • Окна 8.1
  • Окна 7
  • Windows Vista
  • Windows XP
  • Windows ME
  • Окна 2000

Strerror

Строковая функция strerror — функция языков C/C++, транслирующая код ошибки, который обычно хранится в глобальной переменной errno, в сообщение об ошибке, понятном человеку.

Содержание

История

Функция strerror определена в IEEE Std 1003.1, также известном как POSIX 1.

Реентрабельность

Функция strerror не реентрабельна. Существуют две потокобезопасных замены strerror: strerror_s в visual c++ и strerror_r в стандарте POSIX.

Использование

Подключение

Объявление

Семантика

Функция генерирует и выводит строку в стиле языка Си с сообщением об ошибке, полученного из кода ошибки, переданного errnum.

Смотри также

Ссылки

  1. strerror на сайте OpenGroup
  2. strerror на сайте Codenet

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

Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License.

Почему я не могу использовать strerror?

Я портирую некоторый код на Windows, и компилятор Microsoft (Visual C ++ 8) сообщает мне, что strerror() небезопасен.

Отбросив фактор раздражения во всех безопасных строковых вещах от Microsoft, я на самом деле вижу, что некоторые устаревшие функции опасны. Но я не могу понять, что может быть не так с strerror() . Он принимает код ( int ) и возвращает соответствующую строку или пустую строку, если этот код неизвестен.

Есть ли хорошая альтернатива в C?

Есть ли хорошая альтернатива в C ++?

Имея несколько хороших ответов и теперь понимая, что некоторые реализации могут быть достаточно сумасшедшими, чтобы фактически записывать в общий разделяемый буфер — небезопасно входить в один поток, не говоря уже о потоках! — мой вопрос перестает звучать так: «Почему я не могу его использовать, и каковы альтернативы? Есть ли приличные, лаконичные альтернативы в C и / или C ++? «

7 ответов

strerror устарел, потому что он не является потокобезопасным. strerror работает с внутренним статическим буфером, который может быть перезаписан другими параллельными потоками. Вы должны использовать безопасный вариант с именем strerror_s .

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

strerror само по себе не небезопасно. В старые времена, прежде чем нарезать нить, это просто не было проблемой. С потоками два или более потоков могли бы вызвать strerror , оставляя возвращенный буфер в неопределенном состоянии. Для однопоточных программ не помешает использовать strerror , если они не играют в какие-то странные игры в libc, например, общую память для всех приложений в DLL.

Для решения этой проблемы есть новый интерфейс с той же функциональностью:

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

ПРИМЕЧАНИЕ: приведенный выше прототип является спецификацией XSI. Это может варьироваться в зависимости от платформы или с параметрами компилятора или #define символов. GNU, например, делает эту или свою собственную версию доступной в зависимости от #define

Имея несколько хороших ответов и теперь понимая, что некоторые реализации могут быть достаточно сумасшедшими, чтобы фактически записывать в общий разделяемый буфер — небезопасно входить в один поток, не говоря уже о потоках! — мой вопрос перестает звучать так: «Почему я не могу его использовать, и каковы альтернативы? Есть ли приличные, лаконичные альтернативы в C и / или C ++? «

Posix указывает strerror_r() , а в Windows вы можете использовать strerror_s() , который немного отличается, но имеет ту же цель. Я делаю это:

Я написал эту функцию, потому что функции потоков Posix не изменяют errno , вместо этого они возвращают код ошибки. Таким образом, эта функция в основном такая же, как perror() , за исключением того, что она позволяет вам предоставить код ошибки, отличный от errno , а также отображает некоторую информацию об отладке. Вы можете адаптировать его к вашим потребностям.

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

Представьте себе это:

В зависимости от реализации strerror() этот код выводит код ошибки для кода ошибки 2, а не для кода ошибки 1.

Для краткой обертки можно использовать STLSoft , stlsoft::error_desc , например:

Глядя на код, кажется, что он реализован в терминах strerror() , что означает, что он будет безопасен для повторного входа в поток (т.е. е. если используется несколько раз в данном выражении), но это не решает проблему многопоточности.

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

Хотя я не знаю причин Microsoft, я отмечаю, что strerror возвращает неконстантный символ *, что означает, что существует риск, что какой-то Merry Prankster вызвал strerror до того, как вы сделали и изменили сообщение.

Я понимаю другой ответ, но я думаю, что показ кода более понятен.

проверить реализацию glibc (мы должны получить похожий код в MS lib)

Когда errnum не является известной ошибкой, необходимо сгенерировать строку типа «Неизвестная ошибка 41». Эта строка НЕ ​​является константой, но генерируется в выделенном буфере. И buf является глобальным вар. поэтому его содержание может измениться при повторном вызове strerror . Вот почему это небезопасно.

С другой стороны, strerror_r(int errnum, char *buf, size_t buflen) , он генерирует строку ошибки для аргумента buf . так что сейчас нет глобального ресурса. Вот почему это потокобезопасно.

Это правильный способ использования strerror_r?

я обеспечиваю C++ обертки к потокобезопасной strerror_r в коде следующим образом:

Это только простой упаковщик так в коде C++ я могу сказать что-то вроде

и использования потокобезопасная печать errno. Также кажется, что можно использовать 128, потому что справочная страница говорит, что strerror_r либо вернет указатель на неизменяемую статическую строку (предположительно завершенную нуль), либо указатель на buf после заполнения его нулевым терминатором независимо от размера . просто не уверен, что с этой простой оболочкой что-то не так.

Создан 21 фев. 13 2013-02-21 17:06:14 Palace Chan

ли у Вас конкретная проблема с этим кодом? – Dark Falcon 21 фев. 13 2013-02-21 17:28:31

1 ответ

Я не понимаю полный контекст, в котором вы хотите его использовать (в частности, какова роль структуры MyErrno и что такое StreamErrno , поскольку ваше определение operator относится к значению типа sockaddr_in , которое не используется).

Однако, в общих чертах, это не безопасный способ использования errno , хотя это совершенно безопасный способ использования strerror_r .

Проблема заключается в том, что вы в основном, вероятно, использовать это в контексте, как это:

То есть, вероятно, будет какой-то системный вызов (выводит строку «что-то плохое случилось») между системой вызов которого не удался, оставив значение в errno и использование errno в вашей функции. Довольно хорошо, что любой системный вызов может привести к установке errno , даже если ошибка безобидна; следовательно, наилучшей практикой является получение значения errno немедленно. Это будет хорошая причина для использования пользовательского типа, как MyError :

Создан 21 фев. 13 2013-02-21 18:23:31 rici

Почему я не могу использовать strerror?

Я переношу некоторый код в Windows, а компилятор Microsoft (Visual С++ 8) сообщает мне, что strerror() является небезопасным.

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

Есть ли хорошая альтернатива в C?

Есть ли хорошая альтернатива в С++?

Имея некоторые хорошие ответы и теперь понимая, что некоторые реализации могут быть настолько сумасшедшими, чтобы на самом деле писать общий общий буфер — небезопасно для повторного размещения в одном потоке, неважно между потоками! — мой вопрос перестает быть «Почему я не могу использовать его, и каковы альтернативы?» на «Есть ли приличные, сжатые альтернативы в C и/или С++?»

6 ответов

strerror устарел, поскольку он не является потокобезопасным. strerror работает во внутреннем статическом буфере, который может быть перезаписан другими параллельными потоками. Вы должны использовать безопасный вариант под названием strerror_s .

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

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

Чтобы устранить это, появился новый интерфейс с той же функциональностью:

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

ПРИМЕЧАНИЕ: вышеупомянутый прототип представляет собой спецификацию XSI. Он может различаться для каждой платформы или с параметрами компилятора или символами #define . GNU, например, делает эту версию или ее собственную версию доступной в зависимости от #define

curl_strerror — Return string describing the given error code

(PHP 5 >= 5.5.0, PHP 7)

curl_strerror — Return string describing the given error code

Описание

Returns a text error message describing the given error code.

Список параметров

One of the » cURL error codes constants.

Возвращаемые значения

Returns error description or NULL for invalid error code.

Примеры

Пример #1 curl_errno() example

// Create a curl handle with a mispelled protocol in URL
$ch = curl_init ( «htp://example.com/» );

// Send request
curl_exec ( $ch );

// Check for errors and display the error message
if( $errno = curl_errno ( $ch )) <
$error_message = curl_strerror ( $errno );
echo «cURL error ( < $errno >):\n < $error_message >» ;
>

// Close the handle
curl_close ( $ch );
?>

Результат выполнения данного примера:

Смотрите также

  • curl_errno() — Возвращает код последней ошибки
  • curl_error() — Возвращает строку с описанием последней ошибки текущего сеанса
  • » Curl error codes
Илон Маск рекомендует:  Что такое код asin арксинус
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Предупреждение!