On 04/22/2010 07:08 PM, luozhiyuan wrote:
> 于 2010-4-23 0:12, John Reiser 写道:
>>> char* p =(char*)
>>> mmap(&start,PAGE_SIZE,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
>>>
>>> *p = 1;
>> This code is bad because it does not check for failure of the system
>> call.
>>
> It's OK to just run the program,
The program succeeds "by accident". The kernel is allowed to return MAP_FAILED
(with EINVAL) for such an mmap, and sometimes it does! Read the manual page
that is displayed by running the shell command "man mmap":
EINVAL We don’t like addr, length, or offset (e.g., they are too large,
or not aligned on a page boundary).
> But it will fail to run with valgrind.
> Why?
memcheck has done you a favor by pointing out that the code is wrong.
In fact there are *TWO* bugs: the code does not check for MAP_FAILED,
and the code does not align the address with the offset.
> You can try the code.
> I trace the syscalls when use valgrind,sys_mmap2 seems to fail:
> [[snip]]
> SYSCALL[22210,1](192) sys_mmap2 ( 0xBECDE76C, 4096, 3, 34, -1, 0 ) -->
> [pre-fail] Failure(0x16)
Notice the "[pre-fail]". That means that memcheck never asked the kernel
to try the mmap. Instead, memcheck noticed that (0 != (0xfff & (addr ^
offset)))
which is a legitimate reason for mmap to fail with EINVAL, and therefore
memcheck returned MAP_FAILED "early". You may argue that it doesn't matter
because of MAP_ANONYMOUS, but it is perfectly legal for memcheck to complain,
because the kernel is not required to check MAP_ANONYMOUS before checking
the address against the offset. The code is incorrect, in two ways.
Fix both of them.
> ==22210== Invalid write of size 1
> ==22210== at 0x8048475: main (valgrind_test.cpp:13)
> ==22210== Address 0xffffffff is not stack'd, malloc'd or (recently) free'd
0xffffffff==MAP_FAILED on a 32-bit machine.
--
------------------------------------------------------------------------------
_______________________________________________
Valgrind-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/valgrind-users