Как защитить память моей общей библиотеки?

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

Как я могу запретить пользователю изменять память моей библиотеки?

История: Однажды он сделал что-то странное с указателем, и некоторая часть кода (sleep_for()) не была выполнена, и это привело к потере большого количества времени на отладку моего кода. (конечно, он не предоставляет свой код)

Как вы справляетесь с этой ситуацией? Я вежливо говорю, что у меня нет времени, но в то же время не хочу из-за своей либеральности отвергать действительно позитивный вопрос.

Если в вашей библиотеке что-то пойдет не так, вы обязаны это исправить. Неважно, что делает пользователь, ваш код должен быть достаточно надежным, чтобы защитить себя от неправильного использования.

OldBoy 26.04.2024 08:44

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

None 26.04.2024 08:49

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

Barmar 26.04.2024 09:07

Если ваша библиотека не может справиться с тем, что пользователи делают «что-то странное», то это ваша проблема, а не пользователя. Это справедливо для любого программного обеспечения.

OldBoy 26.04.2024 09:18

@Бармар, я этого боялся, я не хочу добавлять такую ​​сложность (хотя это может быть легко).

None 26.04.2024 09:43

@OldBoy Я уже говорил тебе, что тебе не хватает базовых знаний о том, как выделяется и защищается память. Пожалуйста, прочитайте несколько книг о процессах.

None 26.04.2024 09:44

@OldBoy На самом деле библиотека ничего не может сделать, чтобы обнаружить, когда какая-то другая часть программы попирает вашу память. Они вызывают неопределенное поведение, и в любой части программы может произойти что угодно. Вы действительно не знаете, о чем говорите.

Barmar 26.04.2024 09:49

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

HolyBlackCat 26.04.2024 10:37

@Barmar Спасибо за добрые слова.

OldBoy 26.04.2024 13:20

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

Wutz 26.04.2024 17:20

Спасибо за ваш опыт! Я сделаю это тогда.

None 26.04.2024 17:21

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

Barmar 26.04.2024 18:13

Проще отказаться от поддержки segfault (обратная трассировка покажет и все). Труднее сказать, когда проблема, кажется, исходит из моей библиотеки.

None 27.04.2024 02:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите вернуть память только для чтения своему клиентскому коду и не уверены, что она не выбросит const, то вы можете mmap() эту память и использовать mprotect() пометить ее как доступную только для чтения после того, как вы ее написали, прежде чем вернуться. это звонящему.

Но я действительно советую вам просто использовать const и информировать своих пользователей о том, что const_cast() вредно.


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

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

None 26.04.2024 14:57

Одна из проблем заключается в том, что мой код выполняется правильно, но что-то сломало std::this_thread::sleep_for, который я использую внутри (подтверждено отпечатками внутри моей библиотеки). Трудно отладить эту ситуацию... Спасибо!

None 26.04.2024 15:00
Ответ принят как подходящий

Вы не можете сделать это в общей библиотеке. Надежный способ сделать это — поместить ваш код в отдельный процесс и иметь четко определенный протокол между вашим приложением и его приложением. Если сообщения верны, ваш процесс не должен аварийно завершиться. А если нет, вы отклоняете входящее сообщение.

Спасибо! Вы имеете в виду МПК? Я бы запустил свою библиотеку в приложении-демоне, и они бы связывались с ней вместо того, чтобы связывать библиотеку? IPC увеличил бы задержку, но если это так, я бы сделал это, по крайней мере, для первой интеграции, и предоставил бы оболочку для ее эмуляции. Как только я узнаю, что она стабильна, они смогут связать мою библиотеку в своем приложении.

None 27.04.2024 02:45

@None: IPC действительно правильное сокращение. Вам нужно будет принять решение по экономическому обоснованию; мы здесь просто указываем на то, что вы можете технически сделать, чтобы защитить свою библиотеку.

MSalters 29.04.2024 09:08

Другие вопросы по теме