texto solo que puedo pueda poder modificar lectura escribir editable campo c++ c memory-management malloc heap-corruption

c++ - que - ¿Hay alguna manera de marcar un fragmento de memoria asignada de solo lectura?



no puedo escribir en un input (3)

un diseño de API defectuoso en el que los usuarios no utilizan un puntero de const devuelto por un método GetValue () que forma parte de una gran estructura de memoria. Como queremos evitar la copia de gran cantidad de memoria, devolvemos el puntero en vivo dentro de una memoria estructurada que tiene un formato específico

Eso no es claramente un diseño de API defectuoso. Una API es un contrato: prometes que tu clase se comportará de una manera particular, los clientes de la clase prometen usar la API de la manera adecuada. Los trucos sucios como const_cast son incorrectos (y en algunos, pero no en todos los casos, tienen un comportamiento indefinido ).

Sería un diseño de API defectuoso si el uso de const_cast llevara a un problema de seguridad. En ese caso, debe copiar el fragmento de memoria o rediseñar la API. Esta es la norma en Java , que no tiene el equivalente de const (a pesar de que const sea ​​una palabra reservada en Java).

si asigno algo de memoria usando malloc() hay una forma de marcarlo de solo lectura. Entonces memcpy () falla si alguien intenta escribir en él?

Esto está conectado a un diseño de API defectuoso en el que los usuarios no utilizan un puntero de const devuelto por un método GetValue() que forma parte de una gran estructura de memoria. Como queremos evitar la copia de gran cantidad de memoria, devolvemos el puntero en vivo dentro de una memoria estructurada que tiene un formato específico. Ahora el problema es que algunos usuarios encuentran truco para hacer que funcionen las cosas al escribir en esta memoria directamente y evitar la llamada a SetValue () que asigna y proporciona correctamente el formato binario de memoria que hemos desarrollado. Aunque hackear algún día el trabajo, pero en algún momento causa violación de acceso a la memoria debido a la interpretación incorrecta de las banderas de control que ha sido anulada por el usuario.

Educar al usuario es una tarea, pero déjame decir por ahora que queremos que el código falle.

Me pregunto si podemos protegernos contra este caso.

Por analogía, supongamos que alguien obtiene una columna de blob de la sentencia sqlite y luego vuelve a escribirla. Aunque en el caso de sqlite no tendrá sentido, pero esto en cierto modo en nuestro caso.



En la mayoría de las arquitecturas de hardware, solo puede cambiar los atributos de protección en páginas de memoria completas; no puede marcar un fragmento de una página de solo lectura.

Las API relevantes son:

Deberá asegurarse de que la página de memoria no contenga nada que no desee que sea de solo lectura. Para hacerlo, deberá sobreasignar con malloc() o utilizar una API de asignación diferente, como mmap() , posix_memalign() o VirtualAlloc() .