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
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments