Libseccomp: ๋ฒ„๊ทธ: seccomp_arch_add()๋Š” ์—”๋””์•ˆ ๋ถˆ์ผ์น˜ ์‹œ -EEXISTS๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 06์›” 20์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: seccomp/libseccomp

(๋‚ด ๋ฌธ์ œ ์„ค๋ช…์€ golang์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” C ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฐธ์กฐ)

๋‚˜๋Š” ์˜ค๋Š˜ ๋‚ด amd64 ์‹œ์Šคํ…œ์—์„œ ScmpFilter.AddArch(seccomp.ArchPPC)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ•„ํ„ฐ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(exportPFC๋ฅผ ํ†ตํ•ด ๋ณผ ์ˆ˜ ์žˆ์Œ).

๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ์žฌ์ƒ๊ธฐ์ž…๋‹ˆ๋‹ค(amd64 ๋˜๋Š” i386์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•จ).

package main

import (
    "os"
    "github.com/seccomp/libseccomp-golang"
)

func main() {
    secFilter, err := seccomp.NewFilter(seccomp.ActKill)
    if err != nil {
        panic(err)
    }
    err = secFilter.AddArch(seccomp.ArchPPC)
    if err != nil {
        panic(err)
    }
    secFilter.ExportPFC(os.Stdout)
}

์•ฝ๊ฐ„์˜ ๋””๋ฒ„๊น… ํ›„์— ์—”๋””์•ˆ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ seccomp_arch_add()๊ฐ€ EEXIST๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. db.c:db_col_db_add()์—๋Š” ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

if (col->endian != 0 && col->endian != db->arch->endian)
        return -EFAULT;

golang ์ฝ”๋“œ๋Š” ๋‚ด๊ฐ€ ๊ด€์ฐฐํ•œ ํ–‰๋™์œผ๋กœ ์ด์–ด์ง€๋Š” EEXIST๋ฅผ (์ •๋‹นํ•˜๊ฒŒ) ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

seccomp_arch_add()๊ฐ€ EINVAL ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ง์ด ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ์œ„ํ—˜ํ•œ ๊ฒฝ์šฐ(๊ธฐ์กด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ) ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. PR์„ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

bug prioritmedium

๋ชจ๋“  18 ๋Œ“๊ธ€

์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@mvo5๋กœ ๋Œ์•„์˜ค๋Š” ๋ฐ ๋„ˆ๋ฌด ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค๋Š” ์ ์„ ๋งค์šฐ ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–‘ํ•ดํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ข€ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๊ด€๋ จ db.c:db_col_db_add()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        if (col->endian != 0 && col->endian != db->arch->endian)
                return -EEXIST;

... ์›๋ž˜ ๋ฌธ์ œ ๋ณด๊ณ ์„œ์˜ ์œ„ ๋ฒ„์ „์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ๋กœ ํŒจ์น˜๋œ ๋ณต์‚ฌ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์—ฌ๊ธฐ์—์„œ ๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์•„์น˜/์—”๋””์•ˆ ์ฝ”๋“œ ์ค‘ ์ ์–ด๋„ ์ผ๋ถ€์—์„œ EDOM์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๊นŒ?

@mheon์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

์šฐ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋™์•ˆ db.c:db_col_merge()๋„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

API์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ๋””๋ฒ„๊น…์— ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

libseccomp-golang ์ธก์—์„œ๋Š” ๋ถ€์ •์ ์ธ ERRNO ๊ทœ์น™์ด ์œ ์ง€๋˜๋Š” ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด AddArch์— ๋ช‡ ์ค„์˜ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด API ๋ฌธ์„œ๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

Travis๋Š” ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ์˜ค๋ž˜๋œ ์ปค๋„์„ ์‹คํ–‰ ์ค‘์ด๋ฏ€๋กœ ํ…Œ์ŠคํŠธ #47์ด ๋‹ค์‹œ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. @pcmoore๊ฐ€ ์–ผ๋งˆ ์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ์— ์•ฝ๊ฐ„์˜ ์˜๋ฆฌํ•จ์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ๋‚ด ์ฑ…์—์„œ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

@drakenclimber ์ œ ์ƒ๊ฐ์—” 47๋ฒˆ์ด ์•„๋‹ˆ๋ผ 46๋ฒˆ ํ…Œ์ŠคํŠธ๋ฅผ

๋ช‡ ๋‹ฌ ์ „์— ๋ผ์ด๋ธŒ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ API ๋ ˆ๋ฒจ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ bpf-sim ํ…Œ์ŠคํŠธ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? bpf-sim ํ…Œ์ŠคํŠธ ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์‹คํ–‰๋˜๊ณ 

Travis๋Š” ์œ„์˜ ์‹คํ–‰์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ #47(KILL_PROCESS)์—์„œ ํ™•์‹คํžˆ ํ† ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์˜ค๋Š˜ ์•„์นจ์— ์˜จ์ „์„ฑ ๊ฒ€์‚ฌ๋กœ ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜๋กœ ํ‘ธ์‹œํ–ˆ์„ ๋•Œ master์˜ HEAD์—์„œ ๋™์ผํ•œ ์‹คํŒจ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ 47-live-kill_process%%001-00001 ๊ฒฐ๊ณผ: FAILURE 47-live-kill_process 3 KILL_PROCESS rc=12

๊ฝค ์˜ค๋ž˜์ „์— ์ด์•ผ๊ธฐ๋ฅผ ํ•ด์„œ ๊ธฐ์–ต์ด ํ๋ฆฟํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Travis์˜ ์ปค๋„์ด 4.14๋ณด๋‹ค ์ด์ „ ๋ฒ„์ „์ด๊ธฐ ๋•Œ๋ฌธ์— Travis๊ฐ€ KILL_PROCESS ํ…Œ์ŠคํŠธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์ด ๋„์ž…๋˜์—ˆ์„ ๋•Œ์˜€์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ฏธ์ณค๋Š”์ง€... ์™„์ „ํžˆ ๊ธฐ์–ต์„ ๋ชปํ•˜๋Š” ๊ฑด๊ฐ€์š”?

ํ , ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” ๊ฑด๊ฐ€์š”? ์•„๋ž˜ ๋นŒ๋“œ ๋ฐ ๋กœ๊ทธ๋ฅผ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

... ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ "c" ํ…Œ์ŠคํŠธ๋งŒ ๋ณต์‚ฌํ–ˆ์œผ๋ฉฐ "python" ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•จ).

 batch name: 46-sim-kill_process
 test mode:  c
 test type:  bpf-sim
Test 46-sim-kill_process%%001-00001 result:   ERROR 46-sim-kill_process rc=12
Test 46-sim-kill_process%%002-00001 result:   ERROR 46-sim-kill_process rc=12
Test 46-sim-kill_process%%003-00001 result:   ERROR 46-sim-kill_process rc=12
Test 46-sim-kill_process%%004-00001 result:   ERROR 46-sim-kill_process rc=12
Test 46-sim-kill_process%%005-00001 result:   ERROR 46-sim-kill_process rc=12
Test 46-sim-kill_process%%006-00001 result:   ERROR 46-sim-kill_process rc=12
 batch name: 47-live-kill_process
 test mode:  c
 test type:  live
Test 47-live-kill_process%%001-00001 result:   SKIPPED (must specify live tests)

... ์˜ˆ, ์ด์ „ ์ปค๋„์—๋Š” ์ผ๋ถ€ ๋ผ์ด๋ธŒ ํ…Œ์ŠคํŠธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ 9d4f7f69714d5af80309aa1b8a6d2c8300bb6730์—์„œ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

FWIW, ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ Travis ๋นŒ๋“œ๊ฐ€ ๊นจ๋—ํ•˜๊ฒŒ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Travis์—์„œ ๋ชจ๋“  ๊ฒƒ์ด "์ •์ƒ"์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ„ฐ ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋นŒ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ _์ •๋ง_ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋งํฌ๋Š” ํ™•์‹คํžˆ ํ…Œ์ŠคํŠธ # 46์ด ๋ฌธ์ œ์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ์— ์žˆ๋Š” "Raw Log" ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด #47์ด ์‹คํŒจํ–ˆ๋‹ค๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์œ„์— ๋‚˜์—ด๋œ ๋งํฌ์˜ ๊ฒฝ์šฐ ์›์‹œ ๋กœ๊ทธ๊ฐ€ ๋‚˜๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ํ•œ ์œ„์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ž์„ธํžˆ ๋ณด๋ฉด ์šฐ๋ฆฌ ๋‘˜ ๋‹ค ๋งž๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

46์€ ์ง€์ ํ•œ ๋Œ€๋กœ ERROR ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  #47์€ FAILURE ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ๋‚ด๊ฐ€ ์›๋ž˜ ๊ฒ€์ƒ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์š”์•ฝ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Regression Test Summary
 tests run: 14090
 tests skipped: 114
 tests passed: 14090
 tests failed: 0
 tests errored: 12
Regression Test Summary
 tests run: 16
 tests skipped: 0
 tests passed: 14
 tests failed: 2
 tests errored: 0

3.x ์ปค๋„๋กœ ๋ถ€ํŒ…ํ•˜๋ฉด ๋‚ด ์‹œ์Šคํ…œ ์ค‘ ํ•˜๋‚˜์—์„œ TravisCI์˜ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ 46์€ sys_chk_seccomp_action() ์—์„œ ๋ฌธ์ œ๊ฐ€

๋‚˜๋Š” Test 47์˜ ๋ฌธ์ œ๊ฐ€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ์ƒํ•˜๊ฒ ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ ์‹คํŒจ ๊ฒฝ๋กœ๋ฅผ ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜๋‹ค. (๋น„๋ก API๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด @pcmoore ๋ณ€๊ฒฝ์ด ์ถ”๊ฐ€๋˜์–ด ์ด๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ ...)

Travis์—์„œ ๋ฌด์—‡์ด ์ด ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ •๋ง ์˜ค๋ž˜๋œ ์ปค๋„๋กœ ๋Œ์•„๊ฐ”์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ ์ชฝ์—์„œ ๋ญ”๊ฐ€?

์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด bpf-sim ํ…Œ์ŠคํŠธ์— ์•ฝ๊ฐ„์˜ ์Šค๋งˆํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. *.tests ํŒŒ์ผ์— ์ถ”๊ฐ€๋œ API ์—ด์„ ๋ชจ๋ฐฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์™œ ์ง€๊ธˆ์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ์ •๋ง ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜ ์šฐ๋ถ„ํˆฌ 14.xx๊ฐ€ ์ •๋ง ๊ตฌ์‹์ด๋ผ Travis์—์„œ ์ตœ์‹  ๋ฒ„์ „์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

Ubuntu 16.04(Xenial)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Commit 06f63ba691cb9df119c6759e8f0a150a2a9cbe69๋Š” Ubuntu 16.04๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ์ด ์Šค์œ„์น˜๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— PR์ด ์•„๋‹Œ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜๋ฉด ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋นŒ๋“œ๋Š” ํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ ๊ฐ™์•˜์ง€๋งŒ, clang์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ๊ฒฝ๋กœ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„์— ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—„์ฒญ๋‚œ! ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @pcmoore

์ข‹์•„, ์ปค๋ฐ‹ f8854f990004e71ccb9955c33d88d82cdb97ea42๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊นจ๋—ํ•œ ๊ฑด๋ฌผ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฉ”์ธ ๋นŒ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ด ๊ฐœ์ธ ์ง€์ ์—์„œ ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

@drakenclimber ์œ„์˜ ๋ฌธ์ œ ๋กœ๊ทธ์—์„œ ์ด์— ๋Œ€ํ•œ ํŒจ์น˜๊ฐ€ ์ค€๋น„๋œ ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์•„์ง PR์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํŒจ์น˜์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด PR์„ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ปค๋ฐ‹ 4a35b6ea6f7c836734536420c50a2745a9e24c69๋กœ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ง€๊ธˆ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ฑฐ๋‚˜ ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰