Почему Linux программирует, который разыменовывает (символ*) 0 не всегда segfault?

Я приезжаю в это от C#, но должен быть очень похожим в vb.net.

В Вашем основном программном файле, в Основном методе, у Вас будет что-то как:

Application.Run(new MainForm());

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

Однако, если Вы удаляете параметр к Приложению. Выполненный (), тогда приложение будет запущено без показанной формы, и Вы будете свободны показать и скрыть формы так, как Вам нравится.

Вместо того, чтобы скрыть форму в методе Загрузки, инициализируйте форму перед вызывающим приложением. Выполненный (). Я принимаю форму, будет иметь NotifyIcon на нем для отображения значка в панели задач - это может быть отображено, даже если сама форма еще не видима. Вызов Form.Show() или Form.Hide() от обработчиков событий NotifyIcon покажет и скроет форму соответственно.

6
задан Bill the Lizard 12 January 2010 в 02:29
поделиться

3 ответа

Запись в NULL надежно приведет к сбою сегментации или ошибке шины.

Иногда ОС сопоставляет страницу, доступную только для чтения, с нулевым адресом. Таким образом, иногда вы можете читать из NULL .

Хотя C определяет адрес NULL как особый, «реализация» этого особого статуса фактически обрабатывается виртуальной памятью операционной системы. Подсистема (VM).

WINE и дозему необходимо сопоставить страницу с NULL для совместимости с Windows. См. mmap_min_addr в ядре Linux, чтобы пересобрать ядро, которое не может этого сделать.

mmap_min_addr в настоящее время является горячей темой из-за связанного с ним эксплойта и публичной критики Линуса (очевидно, известного в Linux ) от Тео де Раадта (Theo de Raadt) из проекта OpenBSD.

Если вы хотите закодировать дочерний элемент таким образом, вы всегда можете вызвать: int * ptr_segv = mmap (NULL, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS, -1, 0);

Где PROT_NONE - это ключ к резервированию памяти, к которой нельзя получить доступ. Для 32-разрядной версии Intel Linux PAGE_SIZE равно 4096.

12
ответ дан 8 December 2019 в 17:23
поделиться

Ответ на вопрос номер два из Википедии :

 int main(void)
 {
     char *s = "hello world";
     *s = 'H';
 }
1
ответ дан 8 December 2019 в 17:23
поделиться

Я не уверен, почему у нее нет последовательного поведения. Думаю, с чтением не так придирчиво. Или что-то в этом роде, хотя я, вероятно, совершенно ошибаюсь.

Попробуйте написать в NULL. Мне это кажется последовательным. Я понятия не имею, зачем вам это нужно. :)

int main()
{
    *(int *)0 = 0xFFFFFFFF;
    return -1;
}
1
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: