victor_snezhko (victor_snezhko) wrote,
victor_snezhko
victor_snezhko

Целочисленное переполнение в new[] в gcc

Фокус:

[vvs@freebsd ~]$ uname -m
i386
[vvs@freebsd ~]$ cat >test-alloc.cpp <<EOF
> #include <cstdio>
> int main()
> {
> int *a=new int[0x40000001];
> std::printf("sizeof(int)=%u, ptr=%p\n", sizeof(int), (void*)a);
> return 0;
> }
> EOF
[vvs@freebsd ~]$ g++ -o test-alloc test-alloc.cpp
test-alloc.cpp: In function `int main()':
test-alloc.cpp:4: warning: integer overflow in expression
[vvs@freebsd ~]$ ./test-alloc
sizeof(int)=4, ptr=0x804b030

Запросили блок размером больше адресного пространства (4*0x40000001=0x100000004) - прекрасно выделился блок из 1 int'а.
У gcc, правда, получилось предупредить об этом, потому что запрашиваемый размер - константа.
Но новые gcc (почти выпущенный 4.2) уже и в таком случае не предупреждают, даже с -W -Wall.

В комитете C++ подтвердили, что можно это не чинить - пусть программы сами проверяют. Отсюда:

Each implementation is required to document the maximum size of an object (Annex B limits). It is not difficult for a program to check array allocations to ensure that they are smaller than this quantity.
Tags: gcc, memory management, security
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments