Почему я не могу вызвать ошибку seg?

Хорошо по любой причине я испытываю затруднения при порождении ошибки seg. Я хочу произвести тот так, чтобы я мог использовать gdb видеть, как отладить тот. Я попробовал оба примера из статьи Wikipedia все же никакая работа.

Первый:

char *s = "Hello World!";
*s = 'H';

И второй пример:

int main(void) 
{
    main();
}

Править: Я использую Ubutnu 9.10 и g++ как мой компилятор. Кто-либо может показать мне некоторый кодекс, который гарантируется segfault?

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

10 ответов

Это невозможно попытаться, и надежно сделайте его разыгрывающие указатели.
Это связано с тем, как приложение обрабатывает память, может варьироваться от компилятора к компилятору, также на одном и том же компиляторе с различными вариантами (режим отладки / выпуска, обработанный по-разному).

То, что вы можете сделать, явно поднимает SegFault с использованием сигнала:

#include <signal.h>

int main()
{
    raise(SIGSEGV);
}
40
ответ дан 30 November 2019 в 05:44
поделиться

Обе вещи, которые вы делаете, будет производить «неопределенное поведение» в C ++ (ну, вызов Main () на самом деле явно запрещено). Нет гарантии, что они приведут неисправности SEG - это будет зависеть от многих вещей, но в основном платформа, на которой вы работаете, которые вы не указали.

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

5
ответ дан 30 November 2019 в 05:44
поделиться
int *hello = NULL;
printf(*hello);

Или вы можете определить структуру (скажем, структуру HellowOrld)

HelloWorld *myWorld = NULL;
myWorld->world = "hello";
2
ответ дан 30 November 2019 в 05:44
поделиться

Много способов генерировать SegFault.

Как разыгрывается плохой указатель:

char *s = (char *)0xDEADBEEF;
*s = 'a';
1
ответ дан 30 November 2019 в 05:44
поделиться

Если вы пытаетесь объединить две константы ... Вы получите один ... по крайней мере, простой способ ...

Strcat («A», «B»);

=)

1
ответ дан 30 November 2019 в 05:44
поделиться

Моя одна строка вкус:

*(char *)0 = 0;
18
ответ дан 30 November 2019 в 05:44
поделиться

Можно использовать GeoDjango , который уже включает эти функции. В противном случае вы можете сделать точно, как вы сказали: геокод адреса, чтобы получить широту и долготу, а затем просто сделать математику; -)

-121--3677809-

В статье Википедии на самом деле перечислены три метода (один из которых является нулевым ограничением указателя); Почему вы не попробовали это?

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

-121--230085-

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

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

Но, как сказал Нил в своем посте, любая из этих вещей приводит к «неопределенному поведению», поэтому код не требуется во время выполнения для генерации ошибки seg.

2
ответ дан 30 November 2019 в 05:44
поделиться

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

-121--3677809-

Статья в Википедии фактически перечислены три метода (один из которых является ненутренним указателем. Почему ты не попробовал этому?

Как и для того, почему два примера, которые вы пытались, не так, ну правильный ответ, поскольку другие отмечали, что это неопределенное поведение, поэтому что-нибудь может произойти (который включает в себя не SegFaulting). Но можно спекулировать, что причина того, что первая форма не потерпела неудачу для вас, потому что ваш компилятор или система - это LAX о защите памяти. Что касается второго случая, Commiler Chast-Recurity-Aware Compiler может оптимизировать бесконечно рекурсивное основной цикл и не в конечном итоге переполняет стопку.

1
ответ дан 30 November 2019 в 05:44
поделиться

Самый короткий SegFault Ever:

*(int*)0=0;
6
ответ дан 30 November 2019 в 05:44
поделиться
char * ptr = 0;
*ptr = 1;

Segmentation fault
1
ответ дан 30 November 2019 в 05:44
поделиться
Другие вопросы по тегам:

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