2001-10-15 06:48:21

by Dinesh Gandhewar

[permalink] [raw]
Subject:


Hello,
What is the effect of following statement at the end of function definition?
*(int *)0 = 0;
Thanking you,
Dinesh


2001-10-15 07:18:35

by David Ford

[permalink] [raw]
Subject: Re:

That should throw a segmentation fault, in the kernel an OOPS, in this
statement the code is trying to dereference a NULL pointer and store a
value at 0x0.

David

Dinesh Gandhewar wrote:

>Hello,
>What is the effect of following statement at the end of function definition?
>*(int *)0 = 0;
>Thanking you,
>Dinesh
>
>-
>To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>the body of a message to [email protected]
>More majordomo info at http://vger.kernel.org/majordomo-info.html
>Please read the FAQ at http://www.tux.org/lkml/
>


2001-10-15 07:18:35

by Tim Hockin

[permalink] [raw]
Subject: Re: your mail

> What is the effect of following statement at the end of function definition?
> *(int *)0 = 0;

to cause a crash - you can't derefernce a pointer whose value is 0 (NULL).


2001-10-15 16:18:25

by Timur Tabi

[permalink] [raw]
Subject: Re:

David Ford wrote:

> That should throw a segmentation fault, in the kernel an OOPS, in this
> statement the code is trying to dereference a NULL pointer and store a
> value at 0x0.


I much smarter way to do this would be to use this code:

static inline void int3(void) { __asm__ __volatile__ (".byte 0xCC\n"); };

Granted, it's x86-specific, but it works better, since gdb will halt the code
right at that spot rather than inside some trap hander. And it's just more
elegant.

2001-10-18 17:11:52

by Riley Williams

[permalink] [raw]
Subject: Re: *(int *)0 = 0

Hi Timur.

>>> What is the effect of the following statement at the end of a
>>> function definition?
>>>
>>> *(int *)0 = 0;

>> That should throw a segmentation fault, in the kernel an OOPS, in
>> this statement the code is trying to dereference a NULL pointer and
>> store a value at 0x0.

> A much smarter way to do this would be to use this code:

> static inline void int3(void) { __asm__ __volatile__ (".byte 0xCC\n"); };

> Granted, it's x86-specific, but it works better, since gdb will halt
> the code right at that spot rather than inside some trap hander.
> And it's just more elegant.

As I understand it, there's two problems with your suggestion:

1. The fact that it's x86-specific would rule it out as part of
the actual code of most functions, as they are designed to
work on any of the supported processors without change.

However, this can be dealt with by using a macro function and
dropping the macro definition in an arch-specific header file.

2. The code isn't normally designed for what gdb does with it,
but for what it does when run on its own. I believe that the
original results in an error message being thrown up on the
screen, but I suspect your replacement would just halt the
processor and make the user think Linux had crashed.

Comments, anybody?

Best wishes from Riley.