SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
AddressSanitizer
Как сделать программы на C/С++
     надежнее и безопаснее

       Костя Серебряный
             Google
План доклада
●   Ошибки доступа в память (C/C++)
●   AddressSanitizer -- инструмент для
    поиска ошибок
    ○   Что делает
    ○   Как работает
Почему С или С++ ?
●   Всё написано на C или C++
    ○   Даже если Вы об этом не знаете

●   Виртуальные машины (Java, Perl, Python)

●   Базы данных (MySQL)

●   Веб серверы (Apache)

●   Все остальное тоже (libpng, libz, memcached)
C++ в Google
●   Всего > 100М строк кода
    ○   Больше всего кода на С++

●   Серверная часть
    ○   Mapreduce, Bigtable, Spanner, Chubby, ...

●   Chrome (> 10M строк)
Плата за эффективность
+ "Ручное" управление памятью

- Ошибки использования памяти
  * Переполнение буфера
  * Использование после free

  Открытые ворота для хакеров
Что же делать?
●   Бинарная инструментация
    ○   Valgrind, Dr.Memory, Intel Parallel Studio, Purify,
        Bounds Checker, Insure++, ...
    ○   Медленно (> 20x), только heap

●   Отладочный malloc
    ○   Постраничная защита
        ■   electric fence, libgmalloc, Page Heap
    ○   Магические значения
    ○   Находят не всё, медленно, только heap
AddressSanitizer

●   Инструментирующий компилятор +
    библиотека

●   Май 2011: первая версия
    ○   Май 2012: входит в LLVM 3.1

●   clang -faddress_sanitizer a.c
Кстати: Clang, LLVM
●   Компилятор C/C++ (opensource)
●   Независимые модули
    ○   C++ frontend
    ○   Статический анализ, диагностика
    ○   Оптимизатор
    ○   Кодогенератор (x86, ARM, ...)
●   Основной компилятор на MacOS, iOS
●   Активно используется в Google
●   Сопоставим с GCC по производительности
AddressSanitizer

●   Переполнение буфера
    ○   Динамические объекты
    ○   Стековые объекты
    ○   Глобальные объекты
●   Использование после free()
●   Двойной free, пересечение параметров
    memcpy, и др.
Самое главное
●   Среднее замедление: < 2x
    ○   3x-3.5x на очень больших бинарниках (кэш
        инструкций)

●   Клиентские приложения почти не
    замедляются
    ○   Chrome, Firefox
Пример global-buffer-overflow
int global_array[100] = {-1};
int main(int argc, char **argv) {
    return global_array[argc + 100]; // BOOM
}
% clang++ -O1 -faddress-sanitizer example_GlobalOutOfBounds.cc ; ./a.out


==10538== ERROR: AddressSanitizer global-buffer-overflow
READ of size 4 at 0x000000415354 thread T0
    #0 0x402481 in main example_GlobalOutOfBounds.cc:3
    #1 0x7f0a1c295c4d in __libc_start_main ??:0
    #2 0x402379 in _start ??:0
0x000000415354 is located 4 bytes to the right of global variable 'global_array'
  (0x4151c0) of size 400
Пример stack-buffer-overflow
int main(int argc, char **argv) {
 int stack_array[100];
 stack_array[1] = 0;
 return stack_array[argc + 100]; } // BOOM
% clang++ -O1 -faddress-sanitizer example_StackOutOfBounds.cc; ./a.out


==10589== ERROR: AddressSanitizer stack-buffer-overflow
READ of size 4 at 0x7f5620d981b4 thread T0
  #0 0x4024e8 in main example_StackOutOfBounds.cc:4
  #1 0x7f5621db6c4d in __libc_start_main ??:0
  #2 0x402349 in _start ??:0
Address 0x7f5620d981b4 is located at offset 436 in frame <main> of T0's stack:
 This frame has 1 object(s):
  [32, 432) 'stack_array'
Пример heap-buffer-overflow
int main(int argc, char **argv) {
 int *array = new int[100];
 int res = array[argc + 100]; // BOOM
 delete [] array;
 return res; }
% clang++ -O1 -faddress-sanitizer example_HeapOutOfBounds.cc; ./a.out
==10565== ERROR: AddressSanitizer heap-buffer-overflow
READ of size 4 at 0x7fe4b0c76214 thread T0
  #0 0x40246f in main example_HeapOutOfBounds.cc:3
  #1 0x7fe4b0cb4c4d in __libc_start_main ??:0
0x7fe4b0c76214 is located 4 bytes to the right of 400-byte region [0x7fe..., 0x7fe...)
allocated by thread T0 here:
  #0 0x402c36 in operator new[](unsigned long) _asan_rtl_
  #1 0x402422 in main example_HeapOutOfBounds.cc:3
Пример heap-use-after-free
int main(int argc, char **argv) {
 int *array = new int[100];
 delete [] array;
 return array[argc]; } // BOOM
% clang++ -O1 -faddress-sanitizer example_UseAfterFree.cc; ./a.out
==30226== ERROR: AddressSanitizer heap-use-after-free
READ of size 4 at 0x7faa07fce084 thread T0
  #0 0x40433c in main example_UseAfterFree.cc:4
0x7faa07fce084 is located 4 bytes inside of 400-byte region [0x7fa...,x7fa...)
freed by thread T0 here:
  #0 0x4058fd in operator delete[](void*) _asan_rtl_
  #1 0x404303 in main example_UseAfterFree.cc:4
previously allocated by thread T0 here:
  #0 0x405579 in operator new[](unsigned long) _asan_rtl_
  #1 0x4042f3 in main example_UseAfterFree.cc:2
КАК ЖЕ ЭТО ВСЕ РАБОТАЕТ?
Теневой (shadow) байт
●   У любых выравненных 8-и байт
    программы одно из 9-ти состояний:
                                        0
    ○   N хороших байт
                                        7
    ○   (8 - N) плохих
                                        6

                                        5
         Хорошие
                                        4

         Плохие                         3

                                        2
         Тень
                                        1

                                        -1
Отображение память                тень

  0xffffffff   Виртуальные адреса:
  0x20000000
                Тень = Память / 8
                        Память
                        Тень
  0x1fffffff
  0x04000000            Закрыто
  0x03ffffff
  0x00000000
Или так:
0xffffffff
0x40000000
                      Тень =
             Память / 8 + 0x20000000
0x3fffffff             Память
0x28000000
                       Тень
0x27ffffff
0x24000000             Закрыто
0x23ffffff
0x20000000
0x1fffffff
0x00000000
Инструментирование: 8 байт
       *a = ...



char *shadow = (a>>3)+Offset;
if (*shadow)

   ReportError(a);
*a = ...
Инструментирование: < 8 байт
       *a = ...



char *shadow = (a>>3)+Offset;
if (*shadow &&
    *shadow <= ((a&7)+N-1))
   ReportError(a);
*a = ...
Немножко ассемблера
shr $0x3,%rax       # shift by 3
mov $0x100000000000,%rcx
or %rax,%rcx        # add offset
cmpb $0x0,(%rcx)    # load shadow
je 1f <foo+0x1f>
ud2a                # generate SIGILL*

movq $0x1234,(%rdi) # original store


* May use call instead of UD2
Стековые переменные
void foo() {

    char a[328];




    <------------- CODE ------------->

}
Стековые переменные
void foo() {
  char rz1[32]; // 32-byte aligned
  char a[328];
  char rz2[24];
  char rz3[32];
  int *shadow = (&rz1 >> 3) + kOffset;
  shadow[0] = 0xffffffff;  // poison rz1

    shadow[11] = 0xffffff00; // poison rz2
    shadow[12] = 0xffffffff; // poison rz3
    <------------- CODE ------------->
    shadow[0] = shadow[11] = shadow[12] = 0;
}
Глобальные переменные
int a;



struct {
  int original;
  char redzone[60];
} a; // 32-aligned
Библиотека
●   Ининциализация теневой памяти
●   Замена malloc/free
    ○   Отравленные области вокруг malloc
    ○   Отравление памяти при free, карантин
    ○   Сохранение стеков malloc/free
●   Перехват memset, strlen, и т.п.
●   Вывод сообщений
Трофеи
● Chromium (включая WebKit); в первые 10 месяцев
  ○ heap-use-after-free: 201
  ○ heap-buffer-overflow: 73
  ○ global-buffer-overflow: 8
  ○ stack-buffer-overflow: 7
  ○ Google выплатил > $100k внешним исследователям
● Сотни ошибок в серверных приложениях Google
● Firefox, FreeType, FFmpeg, WebRTC, libjpeg-turbo
● Perl, Vim, LLVM, GCC
● MySQL

● А у Вас баги есть?
Есть что улучшить
●   Статический анализ
    ○   Меньше проверок

●   Инструментировать всё
    ○   Библиотеки, Ассемблер

●   Адаптировать для ядра

●   Портировать на Windows
    ○   Уже работает для С
Короче...

●   AddressSanitizer:
    ○   Находит много ошибок в коде на C/C++
    ○   Очень быстрый
    ○   Можно использовать при тестировании
    ○   ... и в боевом режиме (осторожно)
    ○   Работает на Linux, MacOS, Android
    ○   Часть LLVM

    ○   clang.llvm.org/docs/AddressSanitizer.html
А еще у нас есть...
●   ThreadSanitizer
    ○   Находит гонки (data races)
    ○   С++ и Go

●   MemorySanitizer
    ○   Находит использование
        неинициализированных данных (С++)
Q&A
ASan/MSan vs Valgrind
                      Valgrind   ASan        MSan
Heap out-of-bounds    YES        YES         NO
Stack out-of-bounds   NO         YES         NO
Global out-of-bounds NO          YES         NO
Use-after-free        YES        YES         NO
Use-after-return      NO         Sometimes   NO
Uninitialized reads   YES        NO          YES
CPU Overhead          10x-300x   1.5x-3x     3x

Mais conteúdo relacionado

Mais procurados

Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
Miasm defcon russia 23
Miasm defcon russia 23Miasm defcon russia 23
Miasm defcon russia 23DefconRussia
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsPlatonov Sergey
 

Mais procurados (20)

Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
Miasm defcon russia 23
Miasm defcon russia 23Miasm defcon russia 23
Miasm defcon russia 23
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 

Destaque

Capital gains? Taking on London’s living standards challenge
Capital gains? Taking on London’s living standards challengeCapital gains? Taking on London’s living standards challenge
Capital gains? Taking on London’s living standards challengeResolutionFoundation
 
Vishvas resume template-18
Vishvas resume template-18Vishvas resume template-18
Vishvas resume template-18vishvasyadav45
 
Vishvas resume template-7
Vishvas resume template-7Vishvas resume template-7
Vishvas resume template-7vishvasyadav45
 
CII Industry Stakeholders Expectation Survey on Corporate Bond Market in India
CII Industry Stakeholders Expectation Survey on Corporate Bond Market in IndiaCII Industry Stakeholders Expectation Survey on Corporate Bond Market in India
CII Industry Stakeholders Expectation Survey on Corporate Bond Market in IndiaConfederation of Indian Industry
 
Vishvas resume template-10
Vishvas resume template-10Vishvas resume template-10
Vishvas resume template-10vishvasyadav45
 
Mission vishvas-resume template-9
Mission vishvas-resume template-9Mission vishvas-resume template-9
Mission vishvas-resume template-9vishvasyadav45
 
Pmi pmp-resume template-16
Pmi pmp-resume template-16Pmi pmp-resume template-16
Pmi pmp-resume template-16vishvasyadav45
 
Highland Springs Plansbook
Highland Springs PlansbookHighland Springs Plansbook
Highland Springs PlansbookBlakely Rockel
 
Mission vishvas-resume template-13
Mission vishvas-resume template-13Mission vishvas-resume template-13
Mission vishvas-resume template-13vishvasyadav45
 
無題プレゼンテーション6
無題プレゼンテーション6無題プレゼンテーション6
無題プレゼンテーション6s1200017
 
1. tian de business community
1. tian de business community1. tian de business community
1. tian de business communityLiza Alypova
 
DomainSkate NYEBN Presentation 5-14-14
DomainSkate NYEBN Presentation 5-14-14DomainSkate NYEBN Presentation 5-14-14
DomainSkate NYEBN Presentation 5-14-14domainskate
 
турмалиновые сферы для стирки
турмалиновые сферы для стиркитурмалиновые сферы для стирки
турмалиновые сферы для стиркиLiza Alypova
 
Dion computerprogramming
Dion computerprogrammingDion computerprogramming
Dion computerprogramminglittlecricket07
 

Destaque (20)

Capital gains? Taking on London’s living standards challenge
Capital gains? Taking on London’s living standards challengeCapital gains? Taking on London’s living standards challenge
Capital gains? Taking on London’s living standards challenge
 
Resume template 1
Resume template 1Resume template 1
Resume template 1
 
Vishvas resume template-18
Vishvas resume template-18Vishvas resume template-18
Vishvas resume template-18
 
Vishvas resume template-7
Vishvas resume template-7Vishvas resume template-7
Vishvas resume template-7
 
գավառ
գավառգավառ
գավառ
 
CII Industry Stakeholders Expectation Survey on Corporate Bond Market in India
CII Industry Stakeholders Expectation Survey on Corporate Bond Market in IndiaCII Industry Stakeholders Expectation Survey on Corporate Bond Market in India
CII Industry Stakeholders Expectation Survey on Corporate Bond Market in India
 
Vishvas resume template-10
Vishvas resume template-10Vishvas resume template-10
Vishvas resume template-10
 
Mission vishvas-resume template-9
Mission vishvas-resume template-9Mission vishvas-resume template-9
Mission vishvas-resume template-9
 
Pmi pmp-resume template-16
Pmi pmp-resume template-16Pmi pmp-resume template-16
Pmi pmp-resume template-16
 
Highland Springs Plansbook
Highland Springs PlansbookHighland Springs Plansbook
Highland Springs Plansbook
 
Mission vishvas-resume template-13
Mission vishvas-resume template-13Mission vishvas-resume template-13
Mission vishvas-resume template-13
 
無題プレゼンテーション6
無題プレゼンテーション6無題プレゼンテーション6
無題プレゼンテーション6
 
30 ideas in 60 minutes
30 ideas in 60 minutes30 ideas in 60 minutes
30 ideas in 60 minutes
 
1. tian de business community
1. tian de business community1. tian de business community
1. tian de business community
 
DomainSkate NYEBN Presentation 5-14-14
DomainSkate NYEBN Presentation 5-14-14DomainSkate NYEBN Presentation 5-14-14
DomainSkate NYEBN Presentation 5-14-14
 
Technotrend
TechnotrendTechnotrend
Technotrend
 
турмалиновые сферы для стирки
турмалиновые сферы для стиркитурмалиновые сферы для стирки
турмалиновые сферы для стирки
 
CII 90th Business Outlook Survey
CII 90th Business Outlook SurveyCII 90th Business Outlook Survey
CII 90th Business Outlook Survey
 
Tasarim harikalari
Tasarim harikalariTasarim harikalari
Tasarim harikalari
 
Dion computerprogramming
Dion computerprogrammingDion computerprogramming
Dion computerprogramming
 

Semelhante a Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (Константин Серебряный)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Vadim Kosov
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Ontico
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3. Mikhail Shcherbakov
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 

Semelhante a Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (Константин Серебряный) (20)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
 
Cpp
CppCpp
Cpp
 
Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)Низкоуровневая Оптимизация (Андрей Аксенов)
Низкоуровневая Оптимизация (Андрей Аксенов)
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
 
About Python
About PythonAbout Python
About Python
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 

Mais de Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

Mais de Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (Константин Серебряный)

  • 1. AddressSanitizer Как сделать программы на C/С++ надежнее и безопаснее Костя Серебряный Google
  • 2. План доклада ● Ошибки доступа в память (C/C++) ● AddressSanitizer -- инструмент для поиска ошибок ○ Что делает ○ Как работает
  • 3. Почему С или С++ ? ● Всё написано на C или C++ ○ Даже если Вы об этом не знаете ● Виртуальные машины (Java, Perl, Python) ● Базы данных (MySQL) ● Веб серверы (Apache) ● Все остальное тоже (libpng, libz, memcached)
  • 4. C++ в Google ● Всего > 100М строк кода ○ Больше всего кода на С++ ● Серверная часть ○ Mapreduce, Bigtable, Spanner, Chubby, ... ● Chrome (> 10M строк)
  • 5. Плата за эффективность + "Ручное" управление памятью - Ошибки использования памяти * Переполнение буфера * Использование после free Открытые ворота для хакеров
  • 6. Что же делать? ● Бинарная инструментация ○ Valgrind, Dr.Memory, Intel Parallel Studio, Purify, Bounds Checker, Insure++, ... ○ Медленно (> 20x), только heap ● Отладочный malloc ○ Постраничная защита ■ electric fence, libgmalloc, Page Heap ○ Магические значения ○ Находят не всё, медленно, только heap
  • 7. AddressSanitizer ● Инструментирующий компилятор + библиотека ● Май 2011: первая версия ○ Май 2012: входит в LLVM 3.1 ● clang -faddress_sanitizer a.c
  • 8. Кстати: Clang, LLVM ● Компилятор C/C++ (opensource) ● Независимые модули ○ C++ frontend ○ Статический анализ, диагностика ○ Оптимизатор ○ Кодогенератор (x86, ARM, ...) ● Основной компилятор на MacOS, iOS ● Активно используется в Google ● Сопоставим с GCC по производительности
  • 9. AddressSanitizer ● Переполнение буфера ○ Динамические объекты ○ Стековые объекты ○ Глобальные объекты ● Использование после free() ● Двойной free, пересечение параметров memcpy, и др.
  • 10. Самое главное ● Среднее замедление: < 2x ○ 3x-3.5x на очень больших бинарниках (кэш инструкций) ● Клиентские приложения почти не замедляются ○ Chrome, Firefox
  • 11. Пример global-buffer-overflow int global_array[100] = {-1}; int main(int argc, char **argv) { return global_array[argc + 100]; // BOOM } % clang++ -O1 -faddress-sanitizer example_GlobalOutOfBounds.cc ; ./a.out ==10538== ERROR: AddressSanitizer global-buffer-overflow READ of size 4 at 0x000000415354 thread T0 #0 0x402481 in main example_GlobalOutOfBounds.cc:3 #1 0x7f0a1c295c4d in __libc_start_main ??:0 #2 0x402379 in _start ??:0 0x000000415354 is located 4 bytes to the right of global variable 'global_array' (0x4151c0) of size 400
  • 12. Пример stack-buffer-overflow int main(int argc, char **argv) { int stack_array[100]; stack_array[1] = 0; return stack_array[argc + 100]; } // BOOM % clang++ -O1 -faddress-sanitizer example_StackOutOfBounds.cc; ./a.out ==10589== ERROR: AddressSanitizer stack-buffer-overflow READ of size 4 at 0x7f5620d981b4 thread T0 #0 0x4024e8 in main example_StackOutOfBounds.cc:4 #1 0x7f5621db6c4d in __libc_start_main ??:0 #2 0x402349 in _start ??:0 Address 0x7f5620d981b4 is located at offset 436 in frame <main> of T0's stack: This frame has 1 object(s): [32, 432) 'stack_array'
  • 13. Пример heap-buffer-overflow int main(int argc, char **argv) { int *array = new int[100]; int res = array[argc + 100]; // BOOM delete [] array; return res; } % clang++ -O1 -faddress-sanitizer example_HeapOutOfBounds.cc; ./a.out ==10565== ERROR: AddressSanitizer heap-buffer-overflow READ of size 4 at 0x7fe4b0c76214 thread T0 #0 0x40246f in main example_HeapOutOfBounds.cc:3 #1 0x7fe4b0cb4c4d in __libc_start_main ??:0 0x7fe4b0c76214 is located 4 bytes to the right of 400-byte region [0x7fe..., 0x7fe...) allocated by thread T0 here: #0 0x402c36 in operator new[](unsigned long) _asan_rtl_ #1 0x402422 in main example_HeapOutOfBounds.cc:3
  • 14. Пример heap-use-after-free int main(int argc, char **argv) { int *array = new int[100]; delete [] array; return array[argc]; } // BOOM % clang++ -O1 -faddress-sanitizer example_UseAfterFree.cc; ./a.out ==30226== ERROR: AddressSanitizer heap-use-after-free READ of size 4 at 0x7faa07fce084 thread T0 #0 0x40433c in main example_UseAfterFree.cc:4 0x7faa07fce084 is located 4 bytes inside of 400-byte region [0x7fa...,x7fa...) freed by thread T0 here: #0 0x4058fd in operator delete[](void*) _asan_rtl_ #1 0x404303 in main example_UseAfterFree.cc:4 previously allocated by thread T0 here: #0 0x405579 in operator new[](unsigned long) _asan_rtl_ #1 0x4042f3 in main example_UseAfterFree.cc:2
  • 15. КАК ЖЕ ЭТО ВСЕ РАБОТАЕТ?
  • 16. Теневой (shadow) байт ● У любых выравненных 8-и байт программы одно из 9-ти состояний: 0 ○ N хороших байт 7 ○ (8 - N) плохих 6 5 Хорошие 4 Плохие 3 2 Тень 1 -1
  • 17. Отображение память тень 0xffffffff Виртуальные адреса: 0x20000000 Тень = Память / 8 Память Тень 0x1fffffff 0x04000000 Закрыто 0x03ffffff 0x00000000
  • 18. Или так: 0xffffffff 0x40000000 Тень = Память / 8 + 0x20000000 0x3fffffff Память 0x28000000 Тень 0x27ffffff 0x24000000 Закрыто 0x23ffffff 0x20000000 0x1fffffff 0x00000000
  • 19. Инструментирование: 8 байт *a = ... char *shadow = (a>>3)+Offset; if (*shadow) ReportError(a); *a = ...
  • 20. Инструментирование: < 8 байт *a = ... char *shadow = (a>>3)+Offset; if (*shadow && *shadow <= ((a&7)+N-1)) ReportError(a); *a = ...
  • 21. Немножко ассемблера shr $0x3,%rax # shift by 3 mov $0x100000000000,%rcx or %rax,%rcx # add offset cmpb $0x0,(%rcx) # load shadow je 1f <foo+0x1f> ud2a # generate SIGILL* movq $0x1234,(%rdi) # original store * May use call instead of UD2
  • 22. Стековые переменные void foo() { char a[328]; <------------- CODE -------------> }
  • 23. Стековые переменные void foo() { char rz1[32]; // 32-byte aligned char a[328]; char rz2[24]; char rz3[32]; int *shadow = (&rz1 >> 3) + kOffset; shadow[0] = 0xffffffff; // poison rz1 shadow[11] = 0xffffff00; // poison rz2 shadow[12] = 0xffffffff; // poison rz3 <------------- CODE -------------> shadow[0] = shadow[11] = shadow[12] = 0; }
  • 24. Глобальные переменные int a; struct { int original; char redzone[60]; } a; // 32-aligned
  • 25. Библиотека ● Ининциализация теневой памяти ● Замена malloc/free ○ Отравленные области вокруг malloc ○ Отравление памяти при free, карантин ○ Сохранение стеков malloc/free ● Перехват memset, strlen, и т.п. ● Вывод сообщений
  • 26. Трофеи ● Chromium (включая WebKit); в первые 10 месяцев ○ heap-use-after-free: 201 ○ heap-buffer-overflow: 73 ○ global-buffer-overflow: 8 ○ stack-buffer-overflow: 7 ○ Google выплатил > $100k внешним исследователям ● Сотни ошибок в серверных приложениях Google ● Firefox, FreeType, FFmpeg, WebRTC, libjpeg-turbo ● Perl, Vim, LLVM, GCC ● MySQL ● А у Вас баги есть?
  • 27. Есть что улучшить ● Статический анализ ○ Меньше проверок ● Инструментировать всё ○ Библиотеки, Ассемблер ● Адаптировать для ядра ● Портировать на Windows ○ Уже работает для С
  • 28. Короче... ● AddressSanitizer: ○ Находит много ошибок в коде на C/C++ ○ Очень быстрый ○ Можно использовать при тестировании ○ ... и в боевом режиме (осторожно) ○ Работает на Linux, MacOS, Android ○ Часть LLVM ○ clang.llvm.org/docs/AddressSanitizer.html
  • 29. А еще у нас есть... ● ThreadSanitizer ○ Находит гонки (data races) ○ С++ и Go ● MemorySanitizer ○ Находит использование неинициализированных данных (С++)
  • 30. Q&A
  • 31. ASan/MSan vs Valgrind Valgrind ASan MSan Heap out-of-bounds YES YES NO Stack out-of-bounds NO YES NO Global out-of-bounds NO YES NO Use-after-free YES YES NO Use-after-return NO Sometimes NO Uninitialized reads YES NO YES CPU Overhead 10x-300x 1.5x-3x 3x