<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>noriwiki  - 최근 바뀜 [ko]</title>
		<link>http://junhoahn.kr/noriwiki/index.php?title=%ED%8A%B9%EC%88%98:%EC%B5%9C%EA%B7%BC%EB%B0%94%EB%80%9C</link>
		<description>이 피드에 위키의 최근 바뀜을 추적합니다.</description>
		<language>ko</language>
		<generator>MediaWiki 1.43.0</generator>
		<lastBuildDate>Sat, 04 Apr 2026 20:04:15 GMT</lastBuildDate>
		<item>
			<title>Data Flow Analysis</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=Data_Flow_Analysis&amp;diff=7093&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=Data_Flow_Analysis&amp;diff=7093&amp;oldid=0</guid>
			<description>&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EB%B6%84%EC%84%9D&quot; title=&quot;분류:프로그램 분석&quot;&gt;분류:프로그램 분석&lt;/a&gt;  == 개요 == &amp;#039;&amp;#039;&amp;#039;Data Flow Analysis&amp;#039;&amp;#039;&amp;#039;는 프로그램의 각 지점(program point)에서 변수나 메모리 상태에 대한 정보를 계산하는 정적 분석 기법이다. 이 분석은 프로그램을 실행하지 않고도, 가능한 모든 실행 경로를 고려하여 변수의 값, 상태, 혹은 속성(property)을 추론하는 것을 목표로 한다.  특히, Data Flow Analysis는 프로그램을 &amp;#039;&amp;#039;&amp;#039;Control Flow Graph (CFG)&amp;#039;&amp;#039;&amp;#039;로 변...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류:프로그램 분석]]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Data Flow Analysis&amp;#039;&amp;#039;&amp;#039;는 프로그램의 각 지점(program point)에서 변수나 메모리 상태에 대한 정보를 계산하는 정적 분석 기법이다. 이 분석은 프로그램을 실행하지 않고도, 가능한 모든 실행 경로를 고려하여 변수의 값, 상태, 혹은 속성(property)을 추론하는 것을 목표로 한다.&lt;br /&gt;
&lt;br /&gt;
특히, Data Flow Analysis는 프로그램을 &amp;#039;&amp;#039;&amp;#039;Control Flow Graph (CFG)&amp;#039;&amp;#039;&amp;#039;로 변환한 뒤, 각 노드에서의 상태를 정의하고, 이 상태가 CFG를 따라 어떻게 전달(propagate)되는지를 반복적으로 계산하는 방식으로 동작한다. 이 과정에서 각 지점의 상태는 단순한 값이 아니라 &amp;#039;&amp;#039;&amp;#039;추상화된 정보(abstract value)&amp;#039;&amp;#039;&amp;#039;로 표현되며, 이는 실제 실행 시 발생할 수 있는 여러 경우를 하나로 요약한 것이다. DFA는 실제 값 대신 추상 도메인 위에서 계산을 수행함으로써, 현실적인 비용 내에서 프로그램의 전반적인 특성을 파악할 수 있도록 한다.&lt;br /&gt;
&lt;br /&gt;
== Motivation &amp;amp; Importance ==&lt;br /&gt;
Data Flow Analysis는 다음과 같은 이유로 매우 중요한 기술이다.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;컴파일러 최적화&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** Constant propagation: 변수의 값이 상수로 확정되는 경우 이를 전파하여 연산 제거&lt;br /&gt;
** Dead code elimination: 사용되지 않는 코드 제거&lt;br /&gt;
** Redundant computation 제거&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;버그 탐지 및 검증&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** 초기화되지 않은 변수 사용&lt;br /&gt;
** Null pointer dereference&lt;br /&gt;
** Use-after-free와 같은 메모리 오류&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;보안 분석&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** 데이터가 신뢰되지 않은 입력으로부터 왔는지 추적 (taint analysis)&lt;br /&gt;
** 권한 상승이나 정보 유출 가능성 분석&lt;br /&gt;
&lt;br /&gt;
기존의 동적 분석은 특정 실행 경로에 대해서만 정보를 얻을 수 있지만, Data Flow Analysis는 &amp;#039;&amp;#039;&amp;#039;모든 가능한 실행 경로를 동시에 고려&amp;#039;&amp;#039;&amp;#039;하기 때문에, 보다 안전하고 보수적인 결과를 제공한다. 이에, Data Flow Analysis는 다양한 정적 분석 및 검증 시스템의 기반이 된다.&lt;br /&gt;
&lt;br /&gt;
== Challenge ==&lt;br /&gt;
Data Flow Analysis를 설계하고 구현하는 데에는 여러 가지 어려움이 존재한다.&lt;br /&gt;
&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;경로의 폭발(Path Explosion)&amp;#039;&amp;#039;&amp;#039;: 프로그램에는 조건문과 반복문이 존재하기 때문에, 가능한 실행 경로의 수가 기하급수적으로 증가한다. 이를 그대로 추적하는 것은 현실적으로 불가능하다.&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;정보 병합(Merge) 문제&amp;#039;&amp;#039;&amp;#039;:여러 경로에서 동일한 프로그램 지점으로 도달할 경우, 각 경로의 상태를 하나로 합쳐야 한다. 이때 정보를 어떻게 보존하면서도 간결하게 표현할지가 중요하다.&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;정밀도 vs 성능&amp;#039;&amp;#039;&amp;#039;:더 정밀한 분석을 위해서는 더 많은 상태를 유지해야 하지만, 이는 계산 비용 증가로 이어진다. 반대로 단순화하면 빠르지만 부정확해진다.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;루프와 고정점&amp;#039;&amp;#039;&amp;#039;: 루프가 존재하면 상태가 반복적으로 변화하게 되므로, 언제 계산을 멈출지 결정해야 한다. 이를 위해 &amp;#039;&amp;#039;&amp;#039;고정점(Fixed Point)&amp;#039;&amp;#039;&amp;#039; 개념이 사용된다.&lt;br /&gt;
&lt;br /&gt;
이를 해결하기 위해서 &amp;#039;&amp;#039;&amp;#039;lattice 구조와 monotonic transfer function&amp;#039;&amp;#039;&amp;#039;을 사용하여 반드시 수렴하도록 DFA를 설계하는 것이 기본이다.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
=== [[Control Flow Graph]] (CFG) ===&lt;br /&gt;
프로그램의 실행 흐름을 그래프로 나타낸 구조이다.&lt;br /&gt;
&lt;br /&gt;
* 노드: basic block (연속된 명령어의 집합)&lt;br /&gt;
* 간선: 제어 흐름 (branch, jump, function call 등)&lt;br /&gt;
&lt;br /&gt;
CFG는 Data Flow Analysis의 기반이 되며, 모든 상태 전파는 이 그래프 위에서 이루어진다.&lt;br /&gt;
&lt;br /&gt;
=== [[Abstract Domain]] ===&lt;br /&gt;
실제 값을 그대로 사용하는 대신, 이를 추상화한 값으로 표현한다.&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
* 정수 값 → {constant c, non-constant, unknown}&lt;br /&gt;
* 변수 상태 → {initialized, uninitialized}&lt;br /&gt;
* 포인터 상태 → {null, non-null, unknown}&lt;br /&gt;
&lt;br /&gt;
이러한 추상화는 여러 실행 경로를 하나의 상태로 요약하기 위해 필요하다.&lt;br /&gt;
&lt;br /&gt;
=== Lattice ===&lt;br /&gt;
[[파일:Data Flow Analysis Lattice.png|섬네일|오른쪽]]&lt;br /&gt;
Abstract Domain은 일반적으로 &amp;#039;&amp;#039;&amp;#039;lattice 구조&amp;#039;&amp;#039;&amp;#039;를 가진다.&lt;br /&gt;
&lt;br /&gt;
* 각 상태는 부분 순서(partial order)로 비교 가능&lt;br /&gt;
* join 연산을 통해 여러 상태를 결합 가능&lt;br /&gt;
* bottom: 정보 없음 (초기 상태)&lt;br /&gt;
* top: 모든 가능성을 포함 (가장 보수적 상태)&lt;br /&gt;
&lt;br /&gt;
여기서 [[Partial Order]]는 다음과 같은 Order체계를 의미한다.&lt;br /&gt;
 join(a, b) ⩾ a   and   join(a, b) ⩾ b   and   join(x, x) = x&lt;br /&gt;
&lt;br /&gt;
이 구조 덕분에 반복 계산이 항상 수렴하게 된다.&lt;br /&gt;
&lt;br /&gt;
=== Transfer Function ===&lt;br /&gt;
각 프로그램 문장이 상태를 어떻게 변화시키는지를 정의한다.&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
x = y + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* y가 constant이면 → x도 constant&lt;br /&gt;
* y가 unknown이면 → x도 unknown&lt;br /&gt;
&lt;br /&gt;
Transfer function은 &amp;#039;&amp;#039;&amp;#039;monotonic&amp;#039;&amp;#039;&amp;#039;해야 하며, 이는 분석이 안정적으로 수렴하기 위한 조건이다.&lt;br /&gt;
&lt;br /&gt;
=== Join Operation ===&lt;br /&gt;
여러 경로에서 온 상태를 하나로 합치는 연산이다.&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
if (cond) x = 1;&lt;br /&gt;
else x = 2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
→ x ∈ {1, 2}&lt;br /&gt;
&lt;br /&gt;
Join은 정보 손실을 동반할 수 있으며, 이는 분석의 보수성을 증가시킨다.&lt;br /&gt;
&lt;br /&gt;
== Main Idea ==&lt;br /&gt;
Data Flow Analysis의 핵심 아이디어는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* 프로그램의 각 지점에 대해 상태를 정의하고&lt;br /&gt;
* 이 상태를 CFG를 따라 반복적으로 전파하며&lt;br /&gt;
* 더 이상 상태가 변하지 않을 때까지 계산한다&lt;br /&gt;
&lt;br /&gt;
이 과정을 &amp;#039;&amp;#039;&amp;#039;고정점 계산(Fixed Point Computation)&amp;#039;&amp;#039;&amp;#039;이라고 한다.&lt;br /&gt;
&lt;br /&gt;
초기에는 모든 상태를 bottom으로 시작하고, transfer function과 join을 반복 적용하면서 점점 더 많은 정보를 포함하게 된다. 이 과정은 lattice의 구조 덕분에 반드시 수렴한다.&lt;br /&gt;
&lt;br /&gt;
LLVM 문서에서는 이러한 반복 계산을 통해, 각 프로그램 지점에서의 &amp;#039;&amp;#039;&amp;#039;sound한(over-approximate) 결과&amp;#039;&amp;#039;&amp;#039;를 얻을 수 있다고 설명한다.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
=== Worklist Algorithm ===&lt;br /&gt;
실제 구현에서는 &amp;#039;&amp;#039;&amp;#039;worklist 알고리즘&amp;#039;&amp;#039;&amp;#039;이 사용된다.&lt;br /&gt;
&lt;br /&gt;
* 초기 상태 설정&lt;br /&gt;
* 변경이 발생한 노드를 worklist에 추가&lt;br /&gt;
* 하나씩 꺼내어 transfer function 적용&lt;br /&gt;
* 결과가 변하면 후속 노드를 다시 worklist에 추가&lt;br /&gt;
&lt;br /&gt;
이 방식은 불필요한 계산을 줄이면서 효율적으로 고정점에 도달하도록 한다.&lt;br /&gt;
&lt;br /&gt;
=== Forward vs Backward Analysis ===&lt;br /&gt;
* Forward analysis&lt;br /&gt;
** 프로그램 시작 → 끝 방향&lt;br /&gt;
** 예: constant propagation&lt;br /&gt;
&lt;br /&gt;
* Backward analysis&lt;br /&gt;
** 프로그램 끝 → 시작 방향&lt;br /&gt;
** 예: liveness analysis&lt;br /&gt;
&lt;br /&gt;
분석 목적에 따라 방향이 결정된다.&lt;br /&gt;
&lt;br /&gt;
=== May vs Must Analysis ===&lt;br /&gt;
* May analysis&lt;br /&gt;
** 어떤 경로에서라도 가능하면 포함&lt;br /&gt;
** 보수적 (over-approximation)&lt;br /&gt;
&lt;br /&gt;
* Must analysis&lt;br /&gt;
** 모든 경로에서 반드시 성립해야 포함&lt;br /&gt;
** 더 엄격하지만 정보가 줄어들 수 있음&lt;br /&gt;
&lt;br /&gt;
=== Flow-sensitive vs Flow-insensitive ===&lt;br /&gt;
* Flow-sensitive: 프로그램 순서를 고려&lt;br /&gt;
* Flow-insensitive: 순서를 무시하고 전체를 하나로 분석&lt;br /&gt;
&lt;br /&gt;
LLVM 문서에서는 주로 flow-sensitive 분석을 기반으로 설명한다.&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
Data Flow Analysis를 통해 다음과 같은 정보를 얻을 수 있다.&lt;br /&gt;
&lt;br /&gt;
* 각 프로그램 지점에서 변수의 가능한 값 또는 상태&lt;br /&gt;
* 안전한 최적화 수행 가능&lt;br /&gt;
* 프로그램의 잠재적 오류 탐지&lt;br /&gt;
&lt;br /&gt;
특히, 이 분석은 실제 실행 없이도 &amp;#039;&amp;#039;&amp;#039;모든 가능한 실행 경로를 고려한 결과&amp;#039;&amp;#039;&amp;#039;를 제공하며, 이는 정적 분석의 핵심적인 장점이다.&lt;br /&gt;
&lt;br /&gt;
또한 결과는 &amp;#039;&amp;#039;&amp;#039;over-approximation&amp;#039;&amp;#039;&amp;#039;이므로, 실제로는 발생하지 않는 경우도 포함될 수 있지만, 반대로 중요한 오류를 놓치지 않는다는 장점이 있다.&lt;br /&gt;
&lt;br /&gt;
== Contribution (Conclusion) ==&lt;br /&gt;
Data Flow Analysis는 다음과 같은 기여를 한다.&lt;br /&gt;
&lt;br /&gt;
* 프로그램 분석을 위한 일반적인 프레임워크 제공 (CFG + lattice + fixed point)&lt;br /&gt;
* 다양한 최적화 및 정적 분석 기법의 기반&lt;br /&gt;
* 추상 해석을 통해 현실적인 비용으로 전체 프로그램 분석 가능&lt;br /&gt;
&lt;br /&gt;
LLVM 문서에서 설명하듯이, 이 프레임워크는 다양한 분석 문제에 재사용 가능하며, 새로운 분석을 설계할 때도 동일한 구조를 활용할 수 있다.&lt;br /&gt;
&lt;br /&gt;
== Criticize (Conclusion) ==&lt;br /&gt;
다음과 같은 한계가 존재한다.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;False positive&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
보수적 분석으로 인해 실제로는 발생하지 않는 오류도 탐지됨&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;정밀도 한계&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
추상화 과정에서 정보 손실 발생&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;성능 문제&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
복잡한 프로그램에서는 분석 비용 증가&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;모델링 한계&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
실제 실행 환경(예: 시스템 호출, 외부 입력)을 완전히 반영하기 어려움&lt;br /&gt;
&lt;br /&gt;
그럼에도 불구하고, Data Flow Analysis는 현대 컴파일러와 보안 분석에서 필수적인 핵심 기술이며, LLVM과 같은 시스템에서도 핵심 기반으로 활용되고 있다.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# https://clang.llvm.org/docs/DataFlowAnalysisIntro.html&lt;/div&gt;</description>
			<pubDate>Wed, 25 Mar 2026 08:20:51 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%86%A0%EB%A1%A0:Data_Flow_Analysis</comments>
		</item>
		<item>
			<title>파일:Data Flow Analysis Lattice.png</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Data_Flow_Analysis_Lattice.png&amp;diff=7092&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Data_Flow_Analysis_Lattice.png&amp;diff=7092&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/noriwiki/index.php?title=%EC%82%AC%EC%9A%A9%EC%9E%90:Ahn9807&quot; class=&quot;mw-userlink&quot; title=&quot;사용자:Ahn9807&quot;&gt;&lt;bdi&gt;Ahn9807&lt;/bdi&gt;&lt;/a&gt;님이 &lt;a href=&quot;/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:Data_Flow_Analysis_Lattice.png&quot; title=&quot;파일:Data Flow Analysis Lattice.png&quot;&gt;파일:Data Flow Analysis Lattice.png&lt;/a&gt; 파일을 올렸습니다&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;https://clang.llvm.org/docs/DataFlowAnalysisIntro.html&lt;/div&gt;</description>
			<pubDate>Wed, 25 Mar 2026 05:59:43 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC%ED%86%A0%EB%A1%A0:Data_Flow_Analysis_Lattice.png</comments>
		</item>
		<item>
			<title>AddressSanitizer Optimization</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=AddressSanitizer_Optimization&amp;diff=7091&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=AddressSanitizer_Optimization&amp;diff=7091&amp;oldid=0</guid>
			<description>&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:AddressSanitizer&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;분류:AddressSanitizer (없는 문서)&quot;&gt;분류:AddressSanitizer&lt;/a&gt; &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:Program_Analysis&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;분류:Program Analysis (없는 문서)&quot;&gt;분류:Program Analysis&lt;/a&gt; &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:Optimization&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;분류:Optimization (없는 문서)&quot;&gt;분류:Optimization&lt;/a&gt;  == 개요 == 이 문서는 AddressSanitizer(ASan)의 실행 오버헤드를 줄이기 위한 다양한 최적화 기법들을 정리한 문서이다.  ASan은 heap, stack, global object에 대한 out-of-bounds access와 heap use-after-free를 효과적으로 검출하지만, 각 memory access마다 shadow memory를 확인하는 check를 삽입하므로 실행 시간 오버헤드가 크다.   == Remo...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류:AddressSanitizer]]&lt;br /&gt;
[[분류:Program Analysis]]&lt;br /&gt;
[[분류:Optimization]]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
이 문서는 AddressSanitizer(ASan)의 실행 오버헤드를 줄이기 위한 다양한 최적화 기법들을 정리한 문서이다.&lt;br /&gt;
&lt;br /&gt;
ASan은 heap, stack, global object에 대한 out-of-bounds access와 heap use-after-free를 효과적으로 검출하지만, 각 memory access마다 shadow memory를 확인하는 check를 삽입하므로 실행 시간 오버헤드가 크다. &lt;br /&gt;
&lt;br /&gt;
== Removing Unsatisfiable Checks ==&lt;br /&gt;
이 범주는 프로그램 의미론 상 절대로 실패할 수 없는 ASan check를 제거하는 방식이다.&lt;br /&gt;
&lt;br /&gt;
ASan check는 기본적으로 어떤 주소 &amp;lt;math&amp;gt;addr&amp;lt;/math&amp;gt;에 접근하기 전에 그 주소에 대응되는 shadow byte를 확인한다. 그런데 접근 대상 object의 크기와 offset, access size가 모두 정적으로 계산 가능하고, 모든 경로에서 범위 내 접근임이 보장되면 shadow를 확인할 이유가 없다. 이런 check는 남겨 두어도 항상 통과하기만 하므로 순수 오버헤드가 된다.&lt;br /&gt;
&lt;br /&gt;
일반적으로 다음 조건이 모든 실행 경로에서 성립하면 제거 가능하다.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;offset \ge 0&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;offset + access\_size \le object\_size&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어 다음 코드는 접근 위치가 완전히 정적으로 결정된다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
int foo() {&lt;br /&gt;
    char buf[20];&lt;br /&gt;
    buf[10] = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 최적화는 특히 다음과 같은 경우에 잘 적용된다.&lt;br /&gt;
&lt;br /&gt;
* stack object에 대한 상수 인덱스 접근&lt;br /&gt;
* global array에 대한 정적 인덱스 접근&lt;br /&gt;
* 구조체 필드 접근처럼 layout이 compile time에 확정되는 경우&lt;br /&gt;
* inlining과 constant propagation 이후 값이 상수로 환원되는 경우&lt;br /&gt;
&lt;br /&gt;
반대로 다음과 같은 경우는 조심해야 한다.&lt;br /&gt;
&lt;br /&gt;
* pointer arithmetic 결과가 외부 입력에 의존하는 경우&lt;br /&gt;
* heap object 크기가 정적으로 불명확한 경우&lt;br /&gt;
* alias를 통해 실제 object 경계가 바뀔 수 있는 경우&lt;br /&gt;
* signed/unsigned cast 때문에 정적 범위 추론이 깨지는 경우&lt;br /&gt;
&lt;br /&gt;
=== LLVM Backward tracing ===&lt;br /&gt;
실제 코드에서는 인덱스가 항상 상수로 직접 나타나지 않는다. 따라서 단순히 &amp;#039;&amp;#039;배열 첨자에 상수가 들어갔는가&amp;#039;&amp;#039;만 보면 많은 기회를 놓친다. 이를 보완하는 방식이 backward tracing이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
int foo() {&lt;br /&gt;
    char buf[20];&lt;br /&gt;
    unsigned int i = 10;&lt;br /&gt;
    i++;&lt;br /&gt;
    buf[i] = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
표면적으로는 &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;가 변수이므로 동적 접근처럼 보인다. 하지만 SSA 기반 IR에서 보면 최종 값은 &amp;lt;math&amp;gt;11&amp;lt;/math&amp;gt;로 환원 가능하다. 즉, 컴파일러가 정의-사용 사슬을 거슬러 올라가며 값을 역추적하면 이 접근 역시 항상 안전하다고 판단할 수 있다.&lt;br /&gt;
&lt;br /&gt;
이 과정에서 주로 필요한 분석은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* SSA 기반 value propagation&lt;br /&gt;
* constant folding&lt;br /&gt;
* backward slicing&lt;br /&gt;
* simple range analysis&lt;br /&gt;
* dead path pruning&lt;br /&gt;
&lt;br /&gt;
예를 들어 다음과 같은 패턴도 같은 부류이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
int foo() {&lt;br /&gt;
    int idx = 4;&lt;br /&gt;
    int j = idx * 2;&lt;br /&gt;
    char buf[16];&lt;br /&gt;
    buf[j] = 1;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
여기서 &amp;lt;code&amp;gt;j = 8&amp;lt;/code&amp;gt;로 환원되므로 check를 제거할 수 있다.&lt;br /&gt;
&lt;br /&gt;
== Removing Recurring Checks ==&lt;br /&gt;
이 범주는 서로 다른 위치에 삽입된 ASan check들이 논리적으로 같은 안전성 조건을 중복해서 확인하는 경우, 뒤의 check를 제거하는 방식이다.&lt;br /&gt;
&lt;br /&gt;
핵심 질문은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* 이 check가 검사하는 주소는 이전에 검사한 주소와 같은가&lt;br /&gt;
* 이전 check가 더 넓은 범위를 이미 검사했는가&lt;br /&gt;
* control-flow 상 이전 check 이후에 대상 pointer나 object 상태가 바뀌지 않는가&lt;br /&gt;
&lt;br /&gt;
가장 단순한 예시는 같은 pointer를 짧은 구간 안에서 반복 접근하는 경우이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
int *p;&lt;br /&gt;
ASan(p);&lt;br /&gt;
&lt;br /&gt;
if (*p == 0) {&lt;br /&gt;
    ASan(p);&lt;br /&gt;
    *p = 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
두 번째 check는 첫 번째 check와 완전히 같은 대상에 대해 같은 조건을 다시 확인한다. 첫 번째 check 이후에 &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt;가 바뀌지 않고, free가 발생하지 않고, 더 좁아진 memory object로 바뀌지도 않았다면 두 번째 check는 redundant하다.&lt;br /&gt;
&lt;br /&gt;
보다 일반적으로는 다음 조건이 필요하다.&lt;br /&gt;
&lt;br /&gt;
* 두 접근이 must-alias 관계&lt;br /&gt;
* 앞선 check가 동일하거나 더 넓은 범위를 검사&lt;br /&gt;
* 앞선 check가 뒤 check를 dominance 또는 post-dominance 관계로 덮음&lt;br /&gt;
* 두 check 사이에 pointer/object 상태를 깨뜨릴 수 있는 연산이 없음&lt;br /&gt;
&lt;br /&gt;
예를 들어 폭이 다른 access에도 같은 논리가 적용될 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
char *p;&lt;br /&gt;
ASan_8B(p);&lt;br /&gt;
x = *(long long *)p;&lt;br /&gt;
ASan_1B(p);&lt;br /&gt;
y = *p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
앞의 8-byte check가 성공했다면 그 범위 안에 포함되는 1-byte access를 다시 검사할 필요가 없는 경우가 있다. 물론 이는 두 access가 같은 object 내에 있고 중간에 상태 변화가 없을 때만 성립한다.&lt;br /&gt;
&lt;br /&gt;
이 최적화는 특히 다음 상황에서 효과적이다.&lt;br /&gt;
&lt;br /&gt;
* 같은 필드를 여러 번 load/store하는 코드&lt;br /&gt;
* optimizer가 값을 레지스터로 들고 있지 못해 메모리 재접근이 반복되는 경우&lt;br /&gt;
* C++ method chain이나 inline expansion으로 같은 base pointer 검사 코드가 복제되는 경우&lt;br /&gt;
* sanitizer slow path를 피하기 위해 원래부터 보수적으로 많은 check가 들어간 경우&lt;br /&gt;
&lt;br /&gt;
하지만 제거가 위험한 경우도 많다.&lt;br /&gt;
&lt;br /&gt;
* 함수 호출이 사이에 있으면 callee가 free를 수행할 수 있다&lt;br /&gt;
* unknown store가 object metadata를 바꿀 수 있다&lt;br /&gt;
* pointer recast나 integer-to-pointer 변환이 있으면 alias 보장이 약해진다&lt;br /&gt;
* signal, longjmp, exceptional control flow 등 비정상 흐름이 있으면 보수적으로 남겨야 한다&lt;br /&gt;
&lt;br /&gt;
따라서 필요한 분석은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* alias analysis&lt;br /&gt;
* dominance/post-dominance analysis&lt;br /&gt;
* escape analysis&lt;br /&gt;
* interprocedural mod/ref analysis&lt;br /&gt;
* call effect summary&lt;br /&gt;
&lt;br /&gt;
이 계열의 최적화는 check 수를 줄이는 효과가 직접적이며, 특히 대형 C/C++ 프로그램에서 같은 base pointer에 대한 repeated field access가 많기 때문에 체감 효과가 크다.&amp;lt;ref&amp;gt;SANRAZOR: Reducing Redundant Sanitizer Checks in C/C++ Programs. OSDI 2021.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Debloating Address Sanitizer. USENIX Security 2022.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimizing Neighbor Checks ==&lt;br /&gt;
이 범주는 인접한 memory access들이 shadow memory 수준에서는 거의 같은 검사를 수행한다는 점을 이용해, 여러 check를 병합하거나 일부를 제거하는 방식이다.&lt;br /&gt;
&lt;br /&gt;
ASan은 보통 주소를 8:1 shadow mapping으로 변환해 shadow byte를 읽는다. 따라서 주소가 서로 가깝다면 결국 같은 shadow byte 또는 인접한 몇 개의 shadow byte만 확인하게 된다. 이때 source-level access는 여러 개여도 shadow-level 정보는 거의 중복일 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== Mergeable Neighbor Checks ===&lt;br /&gt;
서로 인접한 access가 같은 shadow 영역에 속하면, 여러 개의 ASan check를 하나의 묶음 검사로 합칠 수 있다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 다음과 같은 구조체 field access를 생각할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
struct S {&lt;br /&gt;
    int a;&lt;br /&gt;
    int b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void foo(struct S *ptr) {&lt;br /&gt;
    ptr-&amp;gt;a = 1;&lt;br /&gt;
    ptr-&amp;gt;b = 2;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
일반적인 instrumentation은 다음처럼 각 access마다 독립 check를 넣는다.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ASan(ptr-&amp;gt;a)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ASan(ptr-&amp;gt;b)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
하지만 &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt;와 &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;가 메모리상 연속해 있고 같은 shadow block 또는 매우 가까운 shadow block을 사용한다면, 두 access를 위해 shadow를 두 번 읽는 것은 낭비다. 이때 다음과 같은 병합이 가능하다.&lt;br /&gt;
&lt;br /&gt;
* 먼저 더 큰 범위의 shadow 상태를 한 번 확인&lt;br /&gt;
* fast path에서는 두 access를 모두 safe로 간주&lt;br /&gt;
* slow path에서만 원래의 세밀한 개별 check로 분기&lt;br /&gt;
&lt;br /&gt;
즉, 논리는 &amp;#039;&amp;#039;넓게 한 번 보고, 이상이 있을 때만 자세히 본다&amp;#039;&amp;#039;이다.&lt;br /&gt;
&lt;br /&gt;
이 방식은 다음 이점을 준다.&lt;br /&gt;
&lt;br /&gt;
* shadow load 수 감소&lt;br /&gt;
* conditional branch 수 감소&lt;br /&gt;
* instruction cache pressure 감소&lt;br /&gt;
* 같은 base address 계산의 중복 감소&lt;br /&gt;
&lt;br /&gt;
다만 병합 가능한지는 다음에 좌우된다.&lt;br /&gt;
&lt;br /&gt;
* 두 access의 상대 위치가 정적으로 알려져 있는가&lt;br /&gt;
* 병합한 범위가 false negative 없이 원래 두 check를 커버하는가&lt;br /&gt;
* alignment와 access width 차이 때문에 coarse check가 지나치게 커지지 않는가&lt;br /&gt;
&lt;br /&gt;
=== Removable Neighbor Checks ===&lt;br /&gt;
인접 access 중 일부는 주변 access만으로도 오류가 검출되므로 완전히 제거할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
ptr-&amp;gt;a = ...;&lt;br /&gt;
ptr-&amp;gt;b = ...;&lt;br /&gt;
ptr-&amp;gt;c = ...;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
여기서 &amp;lt;code&amp;gt;ptr-&amp;gt;b&amp;lt;/code&amp;gt;가 가리키는 위치에서 위반이 발생한다면, 그 위반이 구조상 반드시 &amp;lt;code&amp;gt;ptr-&amp;gt;a&amp;lt;/code&amp;gt; 또는 &amp;lt;code&amp;gt;ptr-&amp;gt;c&amp;lt;/code&amp;gt;의 check에서도 드러나는 경우가 있다. 이 경우 &amp;lt;code&amp;gt;ptr-&amp;gt;b&amp;lt;/code&amp;gt; check는 새로운 오류 검출 능력을 추가하지 않는다.&lt;br /&gt;
&lt;br /&gt;
이 최적화는 직관적으로는 애매해 보이지만, 핵심은 &amp;#039;&amp;#039;이 access가 독립적인 정보량을 제공하는가&amp;#039;&amp;#039;이다. 만약 가운데 access가 주변 access들의 union으로 커버되는 memory safety boundary 안에 있다면 중간 check는 제거 가능하다.&lt;br /&gt;
&lt;br /&gt;
대표적으로 다음 상황에서 기회가 생긴다.&lt;br /&gt;
&lt;br /&gt;
* packed struct field access&lt;br /&gt;
* compiler가 분해한 memcpy/memset의 이웃 store들&lt;br /&gt;
* vectorized access가 scalar access로 다시 쪼개진 경우&lt;br /&gt;
* small-width field들이 연달아 접근되는 경우&lt;br /&gt;
&lt;br /&gt;
이 범주의 최적화는 correctness 조건이 섬세하므로 보통 보수적으로 적용한다. 잘못 적용하면 false negative가 생기기 때문이다.&lt;br /&gt;
&lt;br /&gt;
== Optimizing Checks in Loops ==&lt;br /&gt;
loop 내부 check는 ASan overhead의 핵심 원인 중 하나다. 루프는 본질적으로 같은 패턴의 access를 대량 반복하므로, per-iteration instrumentation은 비용이 눈덩이처럼 커진다.&lt;br /&gt;
&lt;br /&gt;
이 범주의 핵심은 다음 두 가지다.&lt;br /&gt;
&lt;br /&gt;
* loop를 도는 동안 변하지 않는 것은 밖으로 빼기&lt;br /&gt;
* 반복되는 접근을 chunk 단위로 묶기&lt;br /&gt;
&lt;br /&gt;
=== Loop-invariant Checks ===&lt;br /&gt;
루프 안에서 같은 주소를 계속 접근한다면 매 iteration마다 ASan check를 할 필요가 없다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
    ASan(ptr);&lt;br /&gt;
    *ptr = i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 코드는 실제로는 같은 위치 &amp;lt;code&amp;gt;ptr&amp;lt;/code&amp;gt;를 반복해서 쓴다. 따라서 다음처럼 바꿀 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
ASan(ptr);&lt;br /&gt;
for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
    *ptr = i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 최적화는 일반 loop-invariant code motion과 유사하지만, 중요한 차이가 있다. 원래 store 자체는 side effect 때문에 루프 밖으로 뺄 수 없더라도, &amp;#039;&amp;#039;check&amp;#039;&amp;#039;는 뺄 수 있다는 점이다.&lt;br /&gt;
&lt;br /&gt;
적용 조건은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* 루프 반복 동안 대상 주소가 변하지 않음&lt;br /&gt;
* 루프 안에서 free/unmap/reallocation 같은 상태 변화가 없음&lt;br /&gt;
* signal-like 비정상 흐름으로 memory validity가 바뀌지 않음&lt;br /&gt;
* hoisted check가 루프 내 모든 access를 sound하게 대표함&lt;br /&gt;
&lt;br /&gt;
이 최적화는 특히 작은 loop body에서 효과가 크다. 원래 check가 차지하던 비중이 커서, hoisting만으로도 branch와 shadow access 수가 크게 줄어든다.&lt;br /&gt;
&lt;br /&gt;
=== Grouped Checks in Loops ===&lt;br /&gt;
loop가 연속된 주소를 차례로 접근한다면, 각 iteration마다 check하는 대신 몇 개 iteration을 묶어서 검사할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
    ASan(ptr + i);&lt;br /&gt;
    ptr[i] = i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 경우 &amp;lt;code&amp;gt;ptr + i&amp;lt;/code&amp;gt;는 연속 증가 주소다. ASan shadow mapping의 granularity를 생각하면, 여러 iteration이 같은 shadow chunk를 공유할 수 있다. 따라서 매번 check하는 대신 다음처럼 바꿀 수 있다.&lt;br /&gt;
&lt;br /&gt;
* 현재 iteration이 속한 shadow chunk를 확인&lt;br /&gt;
* 그 chunk 범위 안에서는 추가 check 생략&lt;br /&gt;
* chunk 경계를 넘을 때만 다시 검사&lt;br /&gt;
&lt;br /&gt;
즉, &amp;#039;&amp;#039;per-access check&amp;#039;&amp;#039;를 &amp;#039;&amp;#039;per-chunk check&amp;#039;&amp;#039;로 바꾸는 것이다.&lt;br /&gt;
&lt;br /&gt;
이 방식이 성립하려면 보통 다음이 필요하다.&lt;br /&gt;
&lt;br /&gt;
* contiguous access 또는 고정 stride access&lt;br /&gt;
* induction variable이 명확함&lt;br /&gt;
* access width가 일정하거나 상한이 추론 가능함&lt;br /&gt;
* redzone boundary를 정확히 고려할 수 있음&lt;br /&gt;
&lt;br /&gt;
예를 들어 &amp;lt;math&amp;gt;8:1&amp;lt;/math&amp;gt; shadow mapping에서 1-byte store가 연속해서 8번 일어나면, 이 8개의 access는 같은 shadow byte 상태와 연관될 수 있다. 이때 매번 shadow를 읽지 않고 한 번만 읽어도 충분한 경우가 많다.&lt;br /&gt;
&lt;br /&gt;
실제 구현 시 고려해야 할 문제는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
* 마지막 iteration에서 chunk를 부분적으로만 쓰는 경우&lt;br /&gt;
* loop peeling/unrolling 후 원래 induction 관계가 바뀌는 경우&lt;br /&gt;
* vectorized loop와 scalar remainder loop를 별도로 처리해야 하는 경우&lt;br /&gt;
* stride가 1이 아니라 2, 4, 8인 경우 coverage 계산이 달라지는 경우&lt;br /&gt;
&lt;br /&gt;
이 범주의 최적화는 대규모 array processing, codec, parser, numeric kernel처럼 loop가 긴 코드에서 특히 효과적이다.&amp;lt;ref&amp;gt;Debloating Address Sanitizer. USENIX Security 2022.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redesigning ASAN Checks ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;/div&gt;</description>
			<pubDate>Mon, 23 Mar 2026 07:11:34 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%86%A0%EB%A1%A0:AddressSanitizer_Optimization</comments>
		</item>
		<item>
			<title>Principles and Methodologies for Serial Performance Optimization</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=Principles_and_Methodologies_for_Serial_Performance_Optimization&amp;diff=7090&amp;oldid=7089</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=Principles_and_Methodologies_for_Serial_Performance_Optimization&amp;diff=7090&amp;oldid=7089</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 3월 19일 (목) 02:23 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l46&quot;&gt;46번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;46번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== [[Conclusion]] ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== [[Conclusion]] ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;이 논문은 Memory allocator optimization을 많이 해 왔던 나의 경험에 비추어서, 평소 생각하고 있었던 Implementation의 Optimization step-by-step solution의 가려운 부분을 긁어준 매우 재미있는 논문이었다. 나중에도 만약 Optimization할일이 있다면, 이 논문에서 제공하는 여러 원리와 방법론들을 참고 하면서 (혹은 GPT에 이 논문을 넣고 해줘 하면서...), checklist를 참고할 수 있을 것 같다는 생각이든다. 논문의 흐름도 매우 매끄럽고, 이해하는데 어려움이 없었지만, 몇몇 설명들은 설명의 Completness를 위해서인지 조금 쉬운 내용을 어렵게 설명하는 느낌이 (E.g., Section 2.1 Principles for performance optimization)있었다. 그리고 원리의 3가지 요소들은 서로 중복되는 면이 없지 않는가 하는 생각이 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;들어쓴ㄴ데&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;이 논문은 Memory allocator optimization을 많이 해 왔던 나의 경험에 비추어서, 평소 생각하고 있었던 Implementation의 Optimization step-by-step solution의 가려운 부분을 긁어준 매우 재미있는 논문이었다. 나중에도 만약 Optimization할일이 있다면, 이 논문에서 제공하는 여러 원리와 방법론들을 참고 하면서 (혹은 GPT에 이 논문을 넣고 해줘 하면서...), checklist를 참고할 수 있을 것 같다는 생각이든다. 논문의 흐름도 매우 매끄럽고, 이해하는데 어려움이 없었지만, 몇몇 설명들은 설명의 Completness를 위해서인지 조금 쉬운 내용을 어렵게 설명하는 느낌이 (E.g., Section 2.1 Principles for performance optimization)있었다. 그리고 원리의 3가지 요소들은 서로 중복되는 면이 없지 않는가 하는 생각이 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;들었다.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 19 Mar 2026 02:23:09 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%86%A0%EB%A1%A0:Principles_and_Methodologies_for_Serial_Performance_Optimization</comments>
		</item>
		<item>
			<title>Principles and Methodologies for Serial Performance Optimization</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=Principles_and_Methodologies_for_Serial_Performance_Optimization&amp;diff=7089&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=Principles_and_Methodologies_for_Serial_Performance_Optimization&amp;diff=7089&amp;oldid=0</guid>
			<description>&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=%EB%B6%84%EB%A5%98:USENIX_OSDI&quot; title=&quot;분류:USENIX OSDI&quot;&gt;분류:USENIX OSDI&lt;/a&gt; {{Paper|title=Principles and Methodologies for Serial Performance Optimization|author=Sujin Park, Mingyu Guan, Xiang Cheng, Taesoo Kim Georgia Institute of Technology|year=2025|conference=USENIX OSDI 19}}  == 개요 == 이 논문은 시스템 성능 최적화에 초점을 맞추고, 이를 체계적으로 최적화하기 위한 framework를 제안한다. 기존에는 성능 최적화가 경험과 직관에 의존했으나, 본 논문은 이를 구조화된...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[분류:USENIX OSDI]]&lt;br /&gt;
{{Paper|title=Principles and Methodologies for Serial Performance Optimization|author=Sujin Park, Mingyu Guan, Xiang Cheng, Taesoo Kim&lt;br /&gt;
Georgia Institute of Technology|year=2025|conference=USENIX OSDI 19}}&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
이 논문은 시스템 성능 최적화에 초점을 맞추고, 이를 체계적으로 최적화하기 위한 framework를 제안한다. 기존에는 성능 최적화가 경험과 직관에 의존했으나, 본 논문은 이를 구조화된 문제로 정의한다.&lt;br /&gt;
&lt;br /&gt;
핵심적으로, sequential task sequence를 최적화하는 세 가지 원리 (removal, replacement, reordering)를 정의하고, 이를 기반으로 8가지 방법론 (batching, caching, precomputing, deferring, relaxation, contextualization, hardware specialization, layering)을 제시한다.&lt;br /&gt;
&lt;br /&gt;
또한, 지난 10년간 OSDI/SOSP 논문 477편을 분석하여, 해당 8가지 방법론이 실제 성능 최적화 기법을 거의 모두 설명할 수 있음을 보인다. 추가적으로 SysGPT라는 fine-tuned LLM을 통해 자동화된 최적화 제안 가능성을 실험적으로 보여준다.&lt;br /&gt;
&lt;br /&gt;
== Motivation &amp;amp; Importance ==&lt;br /&gt;
=== 문제 정의 ===&lt;br /&gt;
시스템 성능 향상의 핵심은 latency 감소와 throughput 증가이다. 이는 유저 경험에 큰 영향을 미치고, &amp;#039;&amp;#039;&amp;#039;사실 논문 작성을 위한 Implementation&amp;#039;&amp;#039;&amp;#039;에서도 대부분의 시간을 차지하는 중요한 작업이다. 여기서 Optimization의 중요한 좀은, Sequential portion이 전체 성능의 bottleneck이 된다는 점이다. 이는 [[암달의 법칙]](Amdahl’s law)으로도 잘 알려져 있다.&lt;br /&gt;
&lt;br /&gt;
기존 연구들은 체계적인 방법론이 아니라 optimization이 경험 기반(heuristic)이기 떄문에, 이러한 경험을 확장시키지 못하였다. 본 논문은 Optimization을 하나의 체계화된 구조로 정리하여서, 쉽게 프로그램의 Serial part를 최적화 할 수 있도록 하였다.&lt;br /&gt;
&lt;br /&gt;
== Main Idea ==&lt;br /&gt;
문헌 조사를 통해서 기존에는 모호하거나 구전되던 여러 방법들을 3개의 원리와 8개의 방법론으로 분류 하였다.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[파일:USENIX OSDI 2025 Sujin, Park Table 1.png|프레임|가운데]]&lt;br /&gt;
=== 3가지의 원리 ===&lt;br /&gt;
* Removal (&amp;lt;math&amp;gt;P_{rm}&amp;lt;/math&amp;gt;): 수행해야 하는 Instruction의 개수를 줄여서 optimization하는 방법이다.&lt;br /&gt;
* Replacement (&amp;lt;math&amp;gt;P_{rep}&amp;lt;/math&amp;gt;): 기존에 수행되던 Instruction을 더 빠른 방식 또는 더 효율적인 알고리즘으로 대체하여 전체 실행 비용을 줄이는 방법이다.&lt;br /&gt;
* Reordering (&amp;lt;math&amp;gt;P_{ord}&amp;lt;/math&amp;gt;): Instruction 또는 Task의 실행 순서를 변경하여 dependency를 유지하면서도 latency를 줄이거나 병목 구간을 완화하는 방법이다.&lt;br /&gt;
&lt;br /&gt;
=== 8가지 Methodologies ===&lt;br /&gt;
# Batching [Rm, Rep, Ord]: 여러 태스크들을 묶어서 처리하여 각 태스크에 존재하는 중복 비용을 제거하고 (&amp;#039;&amp;#039;&amp;#039;Rm&amp;#039;&amp;#039;&amp;#039;), 묶음 단위로 더 효율적인 처리 방식으로 대체하며 (&amp;#039;&amp;#039;&amp;#039;Rep&amp;#039;&amp;#039;&amp;#039;), 실행 순서를 조정하여 locality를 향상시키는 (&amp;#039;&amp;#039;&amp;#039;Ord&amp;#039;&amp;#039;&amp;#039;) 기법이다.&lt;br /&gt;
# Caching [Rep]: 이전에 수행된 연산 결과를 저장해두고 재사용함으로써, 동일한 연산을 반복 수행하는 알고리즘을 대체하는 (&amp;#039;&amp;#039;&amp;#039;Rep&amp;#039;&amp;#039;&amp;#039;) 기법이다.&lt;br /&gt;
# Precomputing [Rm, Ord]: 실행 경로 상에서 수행될 연산을 미리 계산하여 runtime의 critical path에서 해당 작업을 제거하고 (&amp;#039;&amp;#039;&amp;#039;Rm&amp;#039;&amp;#039;&amp;#039;), 실행 시점을 앞당겨 순서를 변경하는 (&amp;#039;&amp;#039;&amp;#039;Ord&amp;#039;&amp;#039;&amp;#039;) 기법이다.&lt;br /&gt;
# Deferring [Ord -&amp;gt; Rm,Ord]: 즉시 수행할 필요가 없는 작업을 나중으로 미루어 실행 순서를 변경하고 (&amp;#039;&amp;#039;&amp;#039;Ord&amp;#039;&amp;#039;&amp;#039;), batching이나 추가적인 최적화 기회를 확보하는 기법이다.&lt;br /&gt;
# Relaxation [Rep, Rm]: 정확성이나 일관성의 일부를 희생하는 대신, 더 단순하고 빠른 연산으로 대체하여 실행 비용을 줄이거나 (&amp;#039;&amp;#039;&amp;#039;Rep&amp;#039;&amp;#039;&amp;#039;) 아니면 생략 하는 (&amp;#039;&amp;#039;&amp;#039;Rm&amp;#039;&amp;#039;&amp;#039;) 기법이다.&lt;br /&gt;
# Contextualization [Rep, Ord]: runtime 상황이나 workload 특성에 맞게 실행 방식을 더 적합한 방식으로 대체하는 (&amp;#039;&amp;#039;&amp;#039;Rep&amp;#039;&amp;#039;&amp;#039;) 방식이다.&lt;br /&gt;
# Hardware Specialization [Rep]: 특정 하드웨어의 특성을 활용하여 기존 연산을 더 빠른 하드웨어 기반 처리로 대체하는 (&amp;#039;&amp;#039;&amp;#039;Rep&amp;#039;&amp;#039;&amp;#039;) 기법이다.&lt;br /&gt;
# Layering [Rm, Rep]: 시스템 계층을 제거하거나 우회하여 불필요한 작업을 제거하고 (&amp;#039;&amp;#039;&amp;#039;Rm&amp;#039;&amp;#039;&amp;#039;), 하나의 레이어를 여러개의 레이어로 나누어서 상호의존성을 줄이는 (&amp;#039;&amp;#039;&amp;#039;Rep&amp;#039;&amp;#039;&amp;#039;) 기법이다.&lt;br /&gt;
&lt;br /&gt;
=== Methodology 특징 ===&lt;br /&gt;
* 여러 방법이 동시에 사용됨 (평균 2.01개)&lt;br /&gt;
* 서로 결합되어 효과 증폭&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
=== Empirical Study ===&lt;br /&gt;
* OSDI/SOSP 477개 논문 분석&lt;br /&gt;
* 206개 performance 논문 모두 8가지 방법론으로 설명 가능 (특히 논문에서 제일 재밌는 파트였는데, 기존의 내가 알고 있던 논문들의 Design들이 제시한 Optimization기법으로 설명된다는 것을 보며, 논문을 읽으면서 들었던 생각인, 어쩌면 중복되는 아이디어가 많다는 생각이 여기서 나온 것은 아닌 가 하는 생각이 들었다. 따라서 Implementation이든 Design이든 새로운 시스템 아이디어를 구현한다는 것은 어떻게 기존 시스템을 보다 최적화 할 수 있다는 것에 있음을 보며, 적절한 Optimization기법을 효과적으로 사용하는 방법을 배우는 과정이라는 생각이 들었다.)&lt;br /&gt;
&lt;br /&gt;
== [[Conclusion]] ==&lt;br /&gt;
이 논문은 Memory allocator optimization을 많이 해 왔던 나의 경험에 비추어서, 평소 생각하고 있었던 Implementation의 Optimization step-by-step solution의 가려운 부분을 긁어준 매우 재미있는 논문이었다. 나중에도 만약 Optimization할일이 있다면, 이 논문에서 제공하는 여러 원리와 방법론들을 참고 하면서 (혹은 GPT에 이 논문을 넣고 해줘 하면서...), checklist를 참고할 수 있을 것 같다는 생각이든다. 논문의 흐름도 매우 매끄럽고, 이해하는데 어려움이 없었지만, 몇몇 설명들은 설명의 Completness를 위해서인지 조금 쉬운 내용을 어렵게 설명하는 느낌이 (E.g., Section 2.1 Principles for performance optimization)있었다. 그리고 원리의 3가지 요소들은 서로 중복되는 면이 없지 않는가 하는 생각이 들어쓴ㄴ데&lt;/div&gt;</description>
			<pubDate>Thu, 19 Mar 2026 02:22:23 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%86%A0%EB%A1%A0:Principles_and_Methodologies_for_Serial_Performance_Optimization</comments>
		</item>
		<item>
			<title>파일:USENIX OSDI 2025 Sujin, Park Table 1.png</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:USENIX_OSDI_2025_Sujin,_Park_Table_1.png&amp;diff=7088&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:USENIX_OSDI_2025_Sujin,_Park_Table_1.png&amp;diff=7088&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/noriwiki/index.php?title=%EC%82%AC%EC%9A%A9%EC%9E%90:Ahn9807&quot; class=&quot;mw-userlink&quot; title=&quot;사용자:Ahn9807&quot;&gt;&lt;bdi&gt;Ahn9807&lt;/bdi&gt;&lt;/a&gt;님이 &lt;a href=&quot;/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:USENIX_OSDI_2025_Sujin,_Park_Table_1.png&quot; title=&quot;파일:USENIX OSDI 2025 Sujin, Park Table 1.png&quot;&gt;파일:USENIX OSDI 2025 Sujin, Park Table 1.png&lt;/a&gt; 파일을 올렸습니다&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Table 1: Summary of the eight methodologies, detailing their underlying principles, visual representations, necessary conditions, and strategic applications.&lt;/div&gt;</description>
			<pubDate>Wed, 18 Mar 2026 12:03:04 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC%ED%86%A0%EB%A1%A0:USENIX_OSDI_2025_Sujin,_Park_Table_1.png</comments>
		</item>
		<item>
			<title>Fast Pointer Nullification for Use-After-Free Prevention</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=Fast_Pointer_Nullification_for_Use-After-Free_Prevention&amp;diff=7087&amp;oldid=7086</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=Fast_Pointer_Nullification_for_Use-After-Free_Prevention&amp;diff=7087&amp;oldid=7086</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 3월 18일 (수) 08:03 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;1번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;index.php?title=&lt;/del&gt;분류:NDSS]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[분류:NDSS]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Paper|title=Fast Pointer Nullification for Use-After-Free Prevention|author=Yubo Du University of Pittsburgh yubo.du@pitt.edu  Youtao Zhang University of Pittsburgh youtao@pitt.edu  Jun Yang University of Pittsburgh juy9@pitt.edu|conference=NDSS 2026|year=2026}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Paper|title=Fast Pointer Nullification for Use-After-Free Prevention|author=Yubo Du University of Pittsburgh yubo.du@pitt.edu  Youtao Zhang University of Pittsburgh youtao@pitt.edu  Jun Yang University of Pittsburgh juy9@pitt.edu|conference=NDSS 2026|year=2026}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Wed, 18 Mar 2026 08:03:10 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%86%A0%EB%A1%A0:Fast_Pointer_Nullification_for_Use-After-Free_Prevention</comments>
		</item>
		<item>
			<title>Fast Pointer Nullification for Use-After-Free Prevention</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=Fast_Pointer_Nullification_for_Use-After-Free_Prevention&amp;diff=7086&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=Fast_Pointer_Nullification_for_Use-After-Free_Prevention&amp;diff=7086&amp;oldid=0</guid>
			<description>&lt;p&gt;새 문서: &lt;a href=&quot;/noriwiki/index.php?title=Index.php%3Ftitle%3D%EB%B6%84%EB%A5%98:NDSS&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Index.php?title=분류:NDSS (없는 문서)&quot;&gt;index.php?title=분류:NDSS&lt;/a&gt;  {{Paper|title=Fast Pointer Nullification for Use-After-Free Prevention|author=Yubo Du University of Pittsburgh yubo.du@pitt.edu  Youtao Zhang University of Pittsburgh youtao@pitt.edu  Jun Yang University of Pittsburgh juy9@pitt.edu|conference=NDSS 2026|year=2026}}  == 개요 == &lt;a href=&quot;/noriwiki/index.php?title=Pointer_nullification&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Pointer nullification (없는 문서)&quot;&gt;Pointer nullification&lt;/a&gt;기법은 &lt;a href=&quot;/noriwiki/index.php?title=Use-after-free&quot; class=&quot;mw-redirect&quot; title=&quot;Use-after-free&quot;&gt;Use-after-free&lt;/a&gt;버그를 효과적으로 막을 수 있지만, 기존의 PN (Pointer nullification)기법들은 메타데이터 Looku...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[index.php?title=분류:NDSS]]&lt;br /&gt;
&lt;br /&gt;
{{Paper|title=Fast Pointer Nullification for Use-After-Free Prevention|author=Yubo Du University of Pittsburgh yubo.du@pitt.edu  Youtao Zhang University of Pittsburgh youtao@pitt.edu  Jun Yang University of Pittsburgh juy9@pitt.edu|conference=NDSS 2026|year=2026}}&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
[[Pointer nullification]]기법은 [[Use-after-free]]버그를 효과적으로 막을 수 있지만, 기존의 PN (Pointer nullification)기법들은 메타데이터 Lookup에 많은 시간이 사용되기 때문에 효율적으로 사용하기는 어려웠다.&lt;br /&gt;
&lt;br /&gt;
이 논문은 &amp;#039;&amp;#039;&amp;#039;Fast Pointer Nullification (FPN)&amp;#039;&amp;#039;&amp;#039;이라는 기법을 제안하여, 최적화된 PN을 통해 UAF 탐지 및 방지의 성능을 향상시키는 것을 목표로 한다.&lt;br /&gt;
&lt;br /&gt;
기존 PN의 핵심 병목이었던 metadata lookup을 단순화하고, 공간적 지역성을 활용한 새로운 저장 구조를 통해 성능과 메모리 오버헤드를 동시에 줄인다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Motivation &amp;amp; Importance ==&lt;br /&gt;
UAF 버그는 dangling pointer가 해제된 메모리를 참조하면서 발생하는 취약점으로, arbitrary code execution 등 심각한 보안 문제로 이어질 수 있다.&lt;br /&gt;
&lt;br /&gt;
이를 방지하기 위한 다양한 기법이 존재하지만, 성능(Performance), 메모리 사용량(Memory consumption), 보안(Security), 호환성(Compatibility) 측면에서 trade-off가 존재한다.&lt;br /&gt;
&lt;br /&gt;
그중 Pointer Nullification (PN)기법은 이러한 trade-off를 비교적 균형 있게 만족하는 방식으로 평가된다.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
[[파일:NDSS 2026 FPN Figure 2.png|섬네일|오른쪽]]&lt;br /&gt;
Pointer Nullification은 다음과 같은 방식으로 동작한다:&lt;br /&gt;
&lt;br /&gt;
# heap object가 생성될 때 metadata를 생성한다.&lt;br /&gt;
# pointer가 특정 object를 가리킬 때, 해당 pointer의 저장 위치를 metadata에 기록한다.&lt;br /&gt;
# object가 free될 때, 해당 object를 가리키는 모든 pointer를 찾아 null로 설정한다.&lt;br /&gt;
&lt;br /&gt;
즉, dangling pointer가 생성되는 것을 사전에 제거하여 UAF를 방지하는 방식이다.&lt;br /&gt;
&lt;br /&gt;
하지만 PN 기법에는 다음과 같은 문제가 존재한다:&lt;br /&gt;
&lt;br /&gt;
* pointer → object 관계를 추적하기 위한 metadata lookup 비용이 매우 큼&lt;br /&gt;
* CAMP 기준으로 약 62.5%의 성능 오버헤드가 lookup에서 발생&lt;br /&gt;
* metadata를 tree/hash 구조로 저장 → cache locality가 매우 나쁨&lt;br /&gt;
&lt;br /&gt;
또한 pointer 저장 위치들은 실제로는 공간적으로 밀집되어 있는 경우가 많음에도 불구하고, 이를 활용하지 못하는 비효율이 존재한다.&lt;br /&gt;
&lt;br /&gt;
== Main Idea ==&lt;br /&gt;
이 논문은 Fast Pointer Nullification이라는 기법을 도입하였다.&lt;br /&gt;
&lt;br /&gt;
FPN은 두 가지 핵심 최적화 디자인을 포함한다:&lt;br /&gt;
&lt;br /&gt;
* Constant-time and lightweight metadata address computation: pointer가 속한 metadata 위치를 bit-shift 연산으로 계산하여 O(1) 접근&lt;br /&gt;
* Spatial locality 활용: individual pointer storage location 대신 &amp;lt;math&amp;gt;2^M&amp;lt;/math&amp;gt; byte-aligned memory block 단위로 관리&lt;br /&gt;
&lt;br /&gt;
즉,&lt;br /&gt;
* 기존 PN: pointer 단위 tracking&lt;br /&gt;
* FPN: block 단위 tracking&lt;br /&gt;
&lt;br /&gt;
을 통해 metadata lookup과 registration 비용을 동시에 줄인다.&lt;br /&gt;
&lt;br /&gt;
== Challenge ==&lt;br /&gt;
* PN 방식은 pointer가 어떤 연결관계를 맺는지를 기억해야 한다. 이 metadata lookup 비용이 매우 크다.  &lt;br /&gt;
** DangNULL: Red-black tree 사용 → O(log n)  &lt;br /&gt;
** CAMP: 최적화했지만 여전히 높은 비용  &lt;br /&gt;
** 전체 성능 오버헤드 중 약 62.50%가 lookup에서 발생  &lt;br /&gt;
* metadata가 spatial locality를 전혀 반영하지 못한다.  &lt;br /&gt;
** hash / tree 기반 구조 → 메모리 상에 무작위 배치  &lt;br /&gt;
** pointer 저장 위치는 실제로 인접한 경우가 많음에도 불구하고 이를 활용하지 못함  &lt;br /&gt;
** cache miss 증가 및 성능 저하 발생  &lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
[[파일:NDSS 2026 FPN Figure 4.png|프레임|가운데]]&lt;br /&gt;
&lt;br /&gt;
FPN은 기존 PN의 동작 구조를 유지하면서 내부 메커니즘을 최적화한다. &lt;br /&gt;
&lt;br /&gt;
여기서 Buffer는 Allocation된 Heap메모리를, Pointer는 그 Buffer를 가르키는 포인터를 의미한다. 예를 들어서 Pointer A = Buffer; 이 있을때, Pointer B = A;면 Pointer A와 Pointer B는 동시에 같은 Buffer B를 가르키고, 과연 어떻게 이러한 종속관계를 빠르게 추적할 수 있는 자료구조를 만들 수 있을지가 이 논문의 핵심이다.&lt;br /&gt;
&lt;br /&gt;
=== Region-based Metadata ===&lt;br /&gt;
메모리를 2^N byte 단위 region으로 분할하고 pointer가 속한 region을 다음과 같이 계산한다:&lt;br /&gt;
&lt;br /&gt;
 region_id = ptr &amp;gt;&amp;gt; N&lt;br /&gt;
&lt;br /&gt;
각 region은 다음 정보를 포함한다:&lt;br /&gt;
* buffer list: 이 리전에 포함된 버퍼들의 리스트를 가지고 있다. 이 리스트는 Buffer info로 관리되며 각 Buffer info는 할당된 메모리들의 Start address와 End address가 있다.&lt;br /&gt;
* block list: 이 리전을 가르키는 포인터들이 어떤 Block에 속하는 지에 대한 리스트를 가지고 있다.&lt;br /&gt;
&lt;br /&gt;
이를 통해 metadata lookup을 constant-time으로 수행할 수 있다. &lt;br /&gt;
&lt;br /&gt;
=== Block-based Pointer Registration ===&lt;br /&gt;
기존 PN는 pointer 저장 위치를 개별적으로 기록하지만 FPN과 같은 경우는 pointer가 속한 block 단위로 등록한다.&lt;br /&gt;
&lt;br /&gt;
 block_addr = store_loc &amp;amp; ~(2^M - 1)&lt;br /&gt;
&lt;br /&gt;
동작:&lt;br /&gt;
# pointer → region 계산&lt;br /&gt;
# region의 block list 접근&lt;br /&gt;
# 최근 block들과 비교하여 중복 제거&lt;br /&gt;
# 새로운 block만 등록 (이 Region에는 Block 1과 Block 2에 해당하는 포인터들이 있다. 즉 Possible한 Pointer의 Range를 가지고 있는 것)&lt;br /&gt;
&lt;br /&gt;
효과:&lt;br /&gt;
# registration 횟수 감소&lt;br /&gt;
# metadata 크기 감소&lt;br /&gt;
# cache locality 향상&lt;br /&gt;
&lt;br /&gt;
=== Nullification 과정 ===&lt;br /&gt;
object free 시:&lt;br /&gt;
# 해당 object가 속한 region 확인&lt;br /&gt;
# region의 block list 순회&lt;br /&gt;
# 각 block 내 pointer 후보 탐색&lt;br /&gt;
# 해당 object를 가리키는 pointer를 null로 설정&lt;br /&gt;
# Region에서 Buffer info제거&lt;br /&gt;
&lt;br /&gt;
특징:&lt;br /&gt;
* pointer를 정확히 저장하지 않고 block 단위로 탐색&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;deallocation frequency가 낮기 때문에 overhead는 제한적&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Status Bit (False Positive 방지) ===&lt;br /&gt;
문제: block 단위 탐색 시 pointer가 아닌 값까지 nullify될 위험 존재한다.&lt;br /&gt;
&lt;br /&gt;
해결: shadow memory 기반 status bit 사용&lt;br /&gt;
&lt;br /&gt;
 status_table[address &amp;gt;&amp;gt; 3]&lt;br /&gt;
* pointer 저장 시 bit 설정&lt;br /&gt;
* free 시 bit 제거&lt;br /&gt;
&lt;br /&gt;
효과:&lt;br /&gt;
* false positive 제거&lt;br /&gt;
* 안전한 nullification &lt;br /&gt;
&lt;br /&gt;
== Evaluation ==&lt;br /&gt;
=== 성능 및 메모리 오버헤드 ===&lt;br /&gt;
: SPEC CPU 2017 기준으로 분석하였을 경우&lt;br /&gt;
* 성능 오버헤드: 약 17.78%&lt;br /&gt;
* 메모리 오버헤드: 약 8.34%&lt;br /&gt;
&lt;br /&gt;
; 기존 PN 대비 크게 개선된 사항&lt;br /&gt;
* CAMP: ~56% performance / ~173% memory&lt;br /&gt;
* FreeSentry: 높은 메모리 오버헤드&lt;br /&gt;
&lt;br /&gt;
== [[Conclusion]] ==&lt;br /&gt;
FPN은 기존 Pointer Nullification의 핵심 병목이었던 metadata lookup 비용과 pointer registration를 Corased-grained block-based region search로 변경하여 문제를 해결하였다. 그결과, 낮은 성능 및 메모리 오버헤드를 가져올 수 있었다. 논문의 몇몇 가정은 동의하기 힘든 부분도 있었지만, &amp;quot;E.g., Page 5, &amp;quot;ALthough scanning entire blocks during nullification may introduce additional performance overhead, deallocations occur infrequently in most applications&amp;quot;, [[BUDAlloc: Defeating Use-After-Free Bugs by Decoupling Virtual Address Management from Kernel|BUDAlloc]]과 [[SwiftSweeper]]를 평가에 반영하였기 때문에 매우 높은 점수를 주고 싶다.&lt;br /&gt;
&lt;br /&gt;
Minor comments: &lt;br /&gt;
&lt;br /&gt;
# Buffer information이 설명없이  그림에만 나와서, 알고리즘을 이해하는데 조금 어려웠다.&lt;br /&gt;
&lt;br /&gt;
Major comments:&lt;br /&gt;
&lt;br /&gt;
# Deallocation frequency가 낮기 때문에 Free성능이 병목이 되지 않는 다고 주장하고 있지만, 이 부분에 대한 명시적인 증거가 필요해 보인다. 추측해 보건데, Deallocation frequency가 낮은 것이 아니라, 단순히 Pointer tracking이 Deallocation시의 Overhead를 감수할만큼 더 많이 Overhead를 줄인 것으로 추측된다.&lt;br /&gt;
# Performance overhead관점에서 보았을 경우, FPN은 Pointer nullification의 단점인 Overhead를 확실히 많이 끌어 올린 것은 맞지만, 기존의 FFmalloc과 같은 논문과 비교하여 아직 부족한 부분이 있다. Pointer nullification을 좀더 빠르게 만들 수 있는 방법으로, Block tracking 내부적으로 Hash를 이용하는 방법이나, 아니면 LLVM컴파일러의 도움을 받는 부분도 탐색하면 좋을 것 같다는 생각이 든다.&lt;/div&gt;</description>
			<pubDate>Wed, 18 Mar 2026 08:02:53 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%86%A0%EB%A1%A0:Fast_Pointer_Nullification_for_Use-After-Free_Prevention</comments>
		</item>
		<item>
			<title>파일:NDSS 2026 FPN Figure 4.png</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:NDSS_2026_FPN_Figure_4.png&amp;diff=7085&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:NDSS_2026_FPN_Figure_4.png&amp;diff=7085&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/noriwiki/index.php?title=%EC%82%AC%EC%9A%A9%EC%9E%90:Ahn9807&quot; class=&quot;mw-userlink&quot; title=&quot;사용자:Ahn9807&quot;&gt;&lt;bdi&gt;Ahn9807&lt;/bdi&gt;&lt;/a&gt;님이 &lt;a href=&quot;/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:NDSS_2026_FPN_Figure_4.png&quot; title=&quot;파일:NDSS 2026 FPN Figure 4.png&quot;&gt;파일:NDSS 2026 FPN Figure 4.png&lt;/a&gt; 파일을 올렸습니다&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Diagram of FPN and comparisons of pointer registrations between previous PN methods and FPN. To illustrate the points-to relationships more clearly, (a) presents two conceptual views of memory (overlapping with each other): a zoomed-in view highlighting the heap region that heap pointers reference, and a full-memory view showing where these pointers may be stored.&lt;/div&gt;</description>
			<pubDate>Wed, 18 Mar 2026 04:56:12 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC%ED%86%A0%EB%A1%A0:NDSS_2026_FPN_Figure_4.png</comments>
		</item>
		<item>
			<title>파일:NDSS 2026 FPN Figure 2.png</title>
			<link>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:NDSS_2026_FPN_Figure_2.png&amp;diff=7084&amp;oldid=0</link>
			<guid isPermaLink="false">http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:NDSS_2026_FPN_Figure_2.png&amp;diff=7084&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/noriwiki/index.php?title=%EC%82%AC%EC%9A%A9%EC%9E%90:Ahn9807&quot; class=&quot;mw-userlink&quot; title=&quot;사용자:Ahn9807&quot;&gt;&lt;bdi&gt;Ahn9807&lt;/bdi&gt;&lt;/a&gt;님이 &lt;a href=&quot;/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC:NDSS_2026_FPN_Figure_2.png&quot; title=&quot;파일:NDSS 2026 FPN Figure 2.png&quot;&gt;파일:NDSS 2026 FPN Figure 2.png&lt;/a&gt; 파일을 올렸습니다&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;NDSS 2026 FPN Figure 2&lt;/div&gt;</description>
			<pubDate>Wed, 18 Mar 2026 03:54:09 GMT</pubDate>
			<dc:creator>Ahn9807</dc:creator>
			<comments>http://junhoahn.kr/noriwiki/index.php?title=%ED%8C%8C%EC%9D%BC%ED%86%A0%EB%A1%A0:NDSS_2026_FPN_Figure_2.png</comments>
		</item>
</channel></rss>