2016-09-10 2 views
0

Я хочу найти каждую инструкцию, которая выделяет память в LLVM IR. Для распределения стека я просто делаю:LLVM Найти каждую инструкцию, которая выделяет память

Instruction* I;  

if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) { 
    //stack allocation 
} 

Но как насчет кучи и статических (глобальных) распределений? Что еще может выделить память в LLVM IR?

Если версия LLVM имеет значение, предоставьте версию, на которую вы ссылаетесь.

ответ

0

Распределение памяти может быть как в стеке, так и в куче. Для распределения стека то, что вы делаете, правильно, вам нужно проверить инструкцию alloca. Выделение кучи выполняется с помощью вызовов функции malloc, нет явной инструкции IR.

Я не делаю никаких экспериментов с этим, но возможно, так вы можете попробовать.

if(MemSetIntrinsic *MSI = dyn_cast<MemSetIntrinsic>(I)) 
      // This call instruction is a memory allocating instruciton 
+0

Нет смысла вкладывать все это, если вы можете непосредственно выполнить внутренний тест в инструкции. Также вы должны просто найти вызовы и проверить, является ли имя вызываемой функции malloc. – Joky

+0

Спасибо за исправление, я внес соответствующие изменения. Проверка имени функции недостаточно, проверка «MemSetIntrinsic» является более общим способом. – DTharun

+0

Malloc не является внутренним, класс «MemSetIntrinsic» обертывает внутренний llvm.memset, который не выделяет память (как задал оп). – Joky

2

В конечном счете вы не сможете это обнаружить. Распределение кучи сводится к вызовам операционной системы, и кто-то может напрямую совершать эти вызовы с помощью встроенной сборки. Также есть вызовы библиотек, на которые у вас не будет видимости.

Помните об этом, что бы вы ни работали.

+0

Не совсем. +1 встроенная сборка для выполнения системного вызова для выделения памяти - это возможно. Но для системного вызова, выделяющего память, делая «nm vmlinux | grep sys_» на моем ядре, я вижу только два, возможно, - sys_brk() и sys_mmap(). не уверен в остальном, но я не думаю, что это много. как для вызова библиотеки: да, различные API в другой библиотеке могут выделять. Например, «malloc()» в libc является одним из них. Поэтому игнорируйте библиотеки, просто сосредоточьтесь на системном вызове, поскольку malloc() по-прежнему в основном вызывает brk(). –

+0

Он, вероятно, также захочет узнать, как это сделать с ядрами, отличными от linux или системами, отличными от posix, можете ли вы сделать этот список? В противном случае я думаю, что «не сможет точно определить это», кажется точным. –

+0

Посмотрите MemorySanitizer от Google: https://github.com/google/sanitizers/wiki/AddressSanitizerAlgorithm https://github.com/google/sanitizers И как он работал: он просто перехватывать на одной функции «malloc()», и он достаточно хорош, чтобы охватить большую часть сценария распределения памяти. –

Смежные вопросы